2014-02-19 97 views
4

這看起來好像比我擅長的更深入IIS!所以我有一個Web API控制器,可以很好地處理GET和POST。第一個屏幕截圖顯示了一個GET的處理。一切都很好,我得到了迴應。在IIS 8.5上HTTP PUT失敗

View Full Size Success Detail

但後來我做PUT請求,這一切分崩離析。這似乎通過ManagedPipelineHandler巡航,然後落空至DefaultDocumentModule和失敗有405

View Full Size Fail Summary

View Full Size Fail Details

沒有安裝任何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。

+0

WebAPI處理PUT嗎? – acarlon

+0

通過這個我的意思是它處理PUT動詞:http://www.asp。net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api – acarlon

+0

添加了操作方法,並且它們裝飾有路由和動詞。 – Montane

回答

1

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

特別是還有/ api/products,所以當http放入路徑/ api/products時,IIS將其視爲目錄瀏覽請求,並拒絕爲其提供PUT動詞。

解決方案:重命名api文件夾,並且通常儘量不要在REST API被調用的地方映射文件夾。這在部署中不是問題,而是在本地Web應用程序中,文件夾在那裏,IIS首先處理它。

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

<modules runAllManagedModulesForAllRequests="true" /> 

,將讓ASP.NET得到一個第一次破裂提前IIS的,然而,這不是一個值得推薦的做法正好解決了這樣一個小問題。

0

我有類似的問題。我的PHP REST Api在IIS 8.5中爲動詞PUT和DELETE返回404。原來,Fast 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,但我希望這可以幫助別人。