簡體   English   中英

IIS 8.5上的HTTP PUT失敗

[英]HTTP PUT Failing on IIS 8.5

這似乎越來越深入IIS而不是我擅長! 所以我有一個適用於GET和POST的Web API控制器。 第一個屏幕截圖顯示了GET的處理。 一切都很棒,我得到了回應。

查看全尺寸 成功細節

但后來我提出了一個PUT請求,這一切都崩潰了。 它似乎穿過ManagedPipelineHandler,然后進入DefaultDocumentModule並以405失敗。

查看全尺寸 失敗摘要

查看全尺寸 失敗詳情

沒有安裝WebDAV,我試圖在web.config級別刪除它。 處理程序被覆蓋以支持PUT。

<handlers>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="OPTIONSVerbHandler" />
  <remove name="TRACEVerbHandler" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" />
</handlers>

盡管如此,ASP.NET無法處理請求,我正在尋找有關調試的一些想法? 這是失敗的動作方法,PUT和一個有效的動作方法,一個GET。

public class ProductsController : ApiController
{
    [HttpPut]
    [Route("api/products")]
    public AddProductResponse AddProduct(AddProductRequest request)
    {
        return new AddProductResponse(); 
    }

    [HttpGet]
    [Route("api/products/manufacturers")]
    public ManufacturersResponse GetProductManufacturers()
    {
        var productService = new ProductService();
        var manufacturers = productService.GetManufacturers();
        return new ManufacturersResponse { Manufacturers = manufacturers.OrderBy(m => m.BusinessName) };
    }
}

似乎我在請求生命周期的早期錯過了手。

FREB似乎顯示了PUT的GENERAL_SHILD_REQUEST_START,不知道為什么托管管道正在創建最終落入無法處理PUT的DefaultDocumentModule的額外子請求。

看看你的場景(感謝分享你的repro項目),問題是投影將webapi放在項目內的/ api文件夾中。

具體來說還有/ api / products,所以當http / ap的/ api /產品被命中時,IIS將其視為目錄瀏覽請求,並拒絕在其上提供PUT動詞。

解決方案:重命名api文件夾,通常嘗試不在正在調用REST API的位置映射文件夾。 這不是部署中的問題,但在本地Web應用程序上,文件夾就在那里,IIS首先處理它。

另一種解決方案(雖然不太推薦)是使用

<modules runAllManagedModulesForAllRequests="true" />

這將讓ASP.NET在IIS之前獲得第一次破解,但這不是一個推薦的做法,只是為了解決這樣的小問題。

我遇到了類似的問題。 我的PHP REST Api在IIS 8.5中為動詞PUT和DELETE返回404。 事實證明,默認情況下,快速CGI模塊沒有收到所有動詞。

要修復它,我將其添加到web.config:

<system.webServer>
    <handlers>
        <remove name="PHP55_via_FastCGI" />
        <add name="PHP55_via_FastCGI" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.5\php-cgi.exe" resourceType="Either" requireAccess="Script" />
    </handlers>
    ...

這適用於PHP,但我希望這對某人有所幫助。

暫無
暫無

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

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