无法 PUT 到我的 IHttpHandler,GET 工作正常

Can't PUT to my IHttpHandler, GET works fine

我正在编写 IHttpHandler。我的环境是 Windows 7 Enterprise,IIS 7(看起来)。我的处理程序是 运行 作为默认应用程序池下的应用程序,在集成模式下是 运行。

目前我的处理程序的 ProcessRequest() 方法仅执行以下操作(此时仅进行测试):

public void ProcessRequest(HttpContext context)
{
    context.Response.StatusCode = 200;
    context.Response.ContentType = "text/html";
    context.Response.Output.Write("file uploaded.");
}

我通过 web.config 添加我的处理程序,如下所示:

<configuration>
    <system.webServer>
        <handlers>
            <add name="HttpUpload" path="*" verb="*" type="HttpUpload, HttpUpload" resourceType="Unspecified"/>
        </handlers>
    </system.webServer>
</configuration>

我正在使用 curl 来测试我的处理程序。当我执行以下操作时:

curl http://localhost/httpupload/foo

有效。但是,当我尝试按如下方式执行 PUT 时:

curl --upload-file build.txt http://localhost/httpupload/foo

失败并显示 405,方法不允许,错误。我四处搜索,Whosebug 上的其他人表示需要删除 WebDAVModule。我删除了它,它确实解决了 405 错误。但是,现在我收到 500.21 错误。从失败的请求跟踪中可以看出,'IIS Web Core' 模块正在生成 500.21 错误,因为 'The data is invalid.' (8007000d)。这个问题似乎类似于 post:

然而,对于其他人来说似乎解决了这个问题,例如 运行 aspnet_regiis -i,但对我没有影响。我调试了我的处理程序,它在使用 GET 时中断了我的处理程序的 ProcessRequest() 方法,但在使用 PUT 时它没有中断,因此我知道它甚至没有被调用。由于某种原因,另一个核心模块调用失败。

编辑:

我对执行 POST 的同一个 URL 执行了一个 curl 命令,并且成功了。所以 GET 和 POST 对我的 http 处理程序有效,而 PUT 则不然。我还在 WebDAV 支持的同一个盒子上对 URL 执行了相同的 --upload-file curl 命令,并且有效。

谢谢, 尼克

好吧,我继续四处搜索,在查看文档的配置时,我看到了以下内容:

runManagedModulesForWebDavRequests

阅读以下文档时:

https://www.iis.net/configreference/system.webserver/modules

我设置为真

<modules runManagedModulesForWebDavRequests="true">

瞧,PUT 现在适用于我的 http 处理程序。我想一旦您安装了 WebDAV,那么所有 PUT 都与 WebDAV 相关联?我不知道,但看起来是这样的。所以看起来如果您安装了 WebDAV,则需要禁用它,然后将此标志设置为 true。