1

我們得到一個405錯誤和IIS7嘗試應用當出現以下異常的ResponseStreamFilterHttpResponse.Filter405(POST不允許)HttpException嘗試應用時HttpResponse.Filter

HttpException: 
The HTTP verb POST used to access path '/app/Thing.asmx/Command' is not allowed. 

,我們正在申請過濾器通過使用HTTP模塊的代碼是這樣的:

var rfs = new ResponseFilterStream(HttpContext.Current.Response.Filter); 
rfs.TransformStream += 
    new Func<System.IO.MemoryStream, System.IO.MemoryStream>(ProcessStream); 
HttpContext.Current.Response.Filter = rfs; 
Log("Response stream filter applied correctly."); 

所有的代碼在我們的HttpModule工作得很好......這一切都包裹在一個try-catch只是爲了安全起見,不拋出任何異常,診斷日誌記錄像最後一行abov e工作正常。

但它看起來像我們在上面的代碼中的ProcessStream方法永遠不會被調用。如果我們將篩選器應用於HttpResponse.Filter,則IIS會在我們的篩選器開始處理之前拋出405異常。

我們的代碼已經在幾個類似的系統工作過,所以我們懷疑這個特定的服務器上的IIS /機器配置負責。什麼可能導致此?

這種情況下405錯誤最常見的原因似乎是使用Url.Rewrite。 (The HTTP verb POST used to access path '/test.html' is not allowed)但是,我們從來沒有使用Url.Rewrite。

另一個常見的原因是請求URL中的尾部斜線。 (HTTP 405 on Error on HTTP POST IIS ASP .NET)但如上所述,請求的URL不以斜線結尾。

應用程序池在一個典型的管道(jQuery AJAX post receives 405 error (HTTP verb POST not allowed))運行.NET 4.0,但我們的代碼沒有問題,在許多其他系統下的經典應用程序池中運行,因此仍然必須是唯一的這個東西服務器的配置。更改爲集成管道會中斷我們的代碼正在過濾的應用程序,所以這不是一個可行的解決方法。

回答

2

事實證明,這是一個非常模糊的IIS錯誤:

http://support.microsoft.com/kb/980368

的ExtensionlessUrl處理器(*.)被錯誤地捲入與請求,而不僅僅是如預期的那樣WebServiceHandlerFactory(*.asmx)。解決方法是:

  1. 手動刪除從Web應用程序的處理器映射ExtensionlessUrl處理條目
  2. 手動移動下任何東西ExtensionlessUrl處理條目,你居然想到被打
  3. 添加系統下一個web.config條目.webServer /處理器根據需要去除ExtensionslessUrl處理器(我們使用這個選項去確保它得到了包括與應用demployment)

我們只好燒在這一個微軟支持票,因爲n值我們可以在任何合理的時間範圍內計算出來。希望這可以幫助別人。