簡體   English   中英

IIS 7.5,Web服務和HTTP 405錯誤

[英]IIS 7.5, Web Service and HTTP 405 error

我有一個Web服務,我在我的機器上托管。 我使用的是Windows 7和IIS 7.5。

問題 :當客戶端嘗試使用Web服務時,他/她會收到HTTP 405錯誤。

在IIS的日志文件中,我可以看到這被拒絕,因為不允許POST動詞。

問題 :如何為這些請求允許POST動詞?
我是否必須添加WSDL文件的映射? 如果我這樣做,我該如何配置此映射? 我檢查過,在現有的映射中,我沒有WSDL擴展。

是否可能在IIS上設置另一個允許這些請求的東西?

Web服務是使用WCF構建的。

經過幾個小時的掙扎,這是幫助我的最終解決方案(從提琴手測試):

  1. 在IIS 7.5 - > YourWebsite - >處理程序映射
  2. 選擇面板右側的“添加模塊映射”選項
  3. 在“請求路徑”字段中輸入* .wsdl
  4. 在“模塊”字段中輸入“ProtocolSupportModule”
  5. 單擊“請求限制”並轉到“動詞”選項卡
  6. 輸入POST動詞
  7. 保存更改

結束瞧,小提琴手不再回答405而是高興200。

列出的答案對我不起作用,但我能夠通過運行來解決問題

“%WINDIR%\\ Microsoft.Net \\ Framework \\ v3.0 \\ Windows Communication Foundation \\ ServiceModelReg.exe”-r

這重新注冊了* .svc的處理程序映射

轉到IIS管理器 - >選擇網站 - >處理程序映射 - >選擇處理程序 - >右鍵單擊並選擇編輯 - >請求限制 - >動詞選項卡

在那里改變價值。

根據您的擴​​展名,它可能是一個不同的處理程序。

對於那些碰到這個頁面但是正在向使用aspx頁面而不是服務的Web應用程序發出請求的人來說,有一件重要的事情需要注意。

如果您向http://localhost/MyApplication發出fiddler http post請求,它將拋出狀態405.但是如果您指定http://localhost/MyApplication/Default.aspx ,它將正確響應(狀態為200)

希望這可以幫助。 我一直在尋找錯誤的地方一小時,調試處理程序,模塊,webdav設置,http動詞等。

結果我沒有啟用WCF HTTP激活。 解決方案: IIS8上的WCF; * .svc處理程序映射不起作用

啊 - 我終於在IIS上找到了我的CORS解決方案。 這是我在尋找解決方案時出現的問題之一。

正確答案是aliostad - 問題來自這樣一個事實,即對於實現'OPTIONS'動詞的一些解決方案,建議刪除該動詞到ProtocolSupportModule的映射。 或許有人只是清理了不必要的映射等。這沒有為OPTIONS留下任何處理程序。

我不是關於幕后發生的事情的專家,但似乎IIS確保在Application_BeginRequest事件被觸發之前很久就有一個潛在的請求處理程序,盡管它們的序列圖如下:

https://msdn.microsoft.com/en-us/library/bb470252.aspx

因此,在不執行模塊的情況下返回405狀態。 例如,發送到服務器的內容是:

OPTIONS http://www.example.com/path/mypage.aspx

所以IIS正在尋找接受OPTIONS動詞的* .aspx處理程序。 如果你查看你的默認applicationHost.config文件,你會看到,例如:

        <add name="PageHandlerFactory-ISAPI-4.0_32bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
        <add name="PageHandlerFactory-ISAPI-4.0_64bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
        <add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" />
        <add name="PageHandlerFactory-Integrated" path="*.aspx" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode" />

我剛剛在web.config中完成了以下操作,使IIS停止返回狀態200 noops:

        <remove name="OPTIONSVerbHandler" />

所以,首先嘗試它,並得出結論,這是我需要的,我在web.config中添加了以下內容:

        <remove name="PageHandlerFactory-ISAPI-4.0_32bit" />
        <remove name="PageHandlerFactory-ISAPI-4.0_64bit" />
        <remove name="PageHandlerFactory-Integrated" />
        <remove name="PageHandlerFactory-Integrated-4.0" />

        <add name="PageHandlerFactory-ISAPI-4.0_32bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG,OPTIONS" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
        <add name="PageHandlerFactory-ISAPI-4.0_64bit" path="*.aspx" verb="GET,HEAD,POST,DEBUG,OPTIONS" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
        <add name="PageHandlerFactory-Integrated-4.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG,OPTIONS" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode,runtimeVersionv4.0" />
        <add name="PageHandlerFactory-Integrated" path="*.aspx" verb="GET,HEAD,POST,DEBUG,OPTIONS" type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode" />

請注意,替換項與applicationHost.config中的內容匹配,除了向每行添加了額外的OPTIONS謂詞。

對於那些使用路由的人(例如MVC或webapi):

        <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
        <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
        <remove name="ExtensionlessUrlHandler-Integrated-4.0" />

        <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
        <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
        <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

最后,我不是IIS專家 - 也許有一種不同的更有效的方法來處理CORS的OPTIONS動詞(更具體地說,允許你的CORS處理程序在沒有'自定義標題'部分解決方案的情況下工作,我對那些人開放解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM