同事在 App_Code 裡放了一支程式,
並且在 Web.Config 的<httpHandlers> 區段做了如下設定:
<httpHandlers>
...
<add verb="*" path="TestFunction.aspx" type="TestProjectSite.ClientBin.GeneratedSomething.TestFunction"/>
<add verb="*" path="*.axd" type="TestProjectSite.ClientBin.GeneratedSomething.TF_output" />
</httpHandlers>
整份程式在開發主機 (Windows 2003 + Visual Studio 2008) 正常運作,
丟到整合測試主機 (Windows 2003, IIS 6) 也運作如常。
上了正式主機 (Windows 2008, IIS 7),連向 TestFunction.aspx,卻回傳 HTTP 404。
試著改了連結的檔名,
故意輸入一組完全不存在的檔名(例如 TestFunction1.aspx),
發現回應 HTTP 404 的頁面長得不一樣。
循此線找到黑暗執行緒的《HttpModules/HttpHandlers in IIS7》。
看來 IIS 6 和 IIS 7 在 Web.Config 中設定的區段不一樣,IIS 6 是要寫在 <httpHandlers>,IIS 7 則是 <handlers>。
依樣畫葫蘆,在 Web.Config 的 <handlers> 區段增加設定值,
但弄一弄竟然變成整個網站回應 HTTP 503。
一陣驚慌之後才發現,整個應用程式集區都停了。
重啟應用程式集區,再重新摸索,在 <handlers> 區段做如下設定:
<handlers>
...
<add name="TestFunction" verb="*" path="TestFunction.aspx" type="TestProjectSite.ClientBin.GeneratedSomething.TestFunction"/>
<add name="TestFunctionOutPut" verb="*" path="*.axd" type="TestProjectSite.ClientBin.GeneratedSomething.TF_output" />
</handlers>
(我和 Jeffrey 的差別是,我沒有增加 resourceType 和 preCondition 屬性)
設定好以後重新連結 TestFunction.aspx,網頁還是出不來。
看事件檢視器的記錄,裡面出現該類別拋出 NotImplementedException。
到 App_Code 裡把程式挖出來看,發現裡面是這樣寫的:
public bool IsReusable
{
get { throw new NotImplementedException(); }
}
查了 MSDN《IHttpHandler.IsReusable 屬性 》,
看人家是 return true,我就也跟著改。
public bool IsReusable
{
get { return true; }
}
到這邊就能正常執行了……但知其然不知其所以然。 XD
總之 IIS 6 和 IIS 7 的差異要注意就是了。
留言列表