【问题标题】:HTTP PUT Failing on IIS 8.5IIS 8.5 上的 HTTP PUT 失败
【发布时间】:2014-03-19 06:01:50
【问题描述】:

这似乎比我擅长的更深入 IIS!所以我有一个非常适合 GET 和 POST 的 Web API 控制器。第一个屏幕截图显示了 GET 的处理。一切都很好,我得到了回应。

View Full Size

但后来我提出了一个 PUT 请求,一切都崩溃了。它似乎在 ManagedPipelineHandler 中巡航,然后进入 DefaultDocumentModule 并以 405 失败。

View Full Size

View Full Size

没有安装 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 的额外子请求。

【问题讨论】:

标签: asp.net http iis asp.net-web-api


【解决方案1】:

查看了您的方案(感谢您分享您的重现项目),问题是预计将 webapi 放置在项目内的 /api 文件夹中。

特别是还有 /api/products,所以当路径 /api/products 被命中 http put 时,IIS 将其视为目录浏览请求,并拒绝在其上提供 PUT 动词。

解决方案:重命名 api 文件夹,一般尽量不要将文件夹映射到调用 REST API 的位置。这在部署中不会成为问题,但在本地 Web 应用程序上,文件夹就在那里,IIS 会首先处理它。

另一种解决方案(虽然不太推荐)是使用

<modules runAllManagedModulesForAllRequests="true" />

这将让 ASP.NET 先于 IIS 获得第一次破解,但是这不是推荐的做法,只是为了解决这样的小问题。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题。我的 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 的,但我希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-01-23
      • 2015-05-26
      • 1970-01-01
      • 2019-01-08
      • 2015-06-29
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多