同事在 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 的差異要注意就是了。


arrow
arrow
    全站熱搜

    小攻城師 發表在 痞客邦 留言(0) 人氣()