不能PUT到我的IHttpHandler,GET工作正常

时间:2015-10-22 15:50:49

标签: iis httphandler put

我正在编写IHttpHandler。我的环境是Windows 7企业版,IIS 7(它出现)。我的处理程序作为默认应用程序池下的应用程序运行,该应用程序池以集成模式运行。

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

source | counts
-------|-----------
 (A,1) | --> emit A
 (A,1) | --> skip
 (C,3) | (3,(C,1))
 (B,2) | (3,(C,1)) --> emit B,C and remove C
 (D,4) | --> emit D
 (F,6) | (6,(F,1))
 (F,6) | (6,(F,2)) --> emit F and remove

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

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

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

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

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

curl http://localhost/httpupload/foo

失败,出现405,Method Not Allowed,错误。我在stackoverflow上搜索周围的其他人表示需要删除WebDAVModule。我删除了它,它确实解决了405错误。但是,现在我收到了500.21的错误。从失败的请求跟踪它说'IIS Web Core'模块正在生成500.21错误,因为'数据无效'。 (8007000d)。问题似乎与这篇文章类似:

IIS 7, HttpHandler and HTTP Error 500.21

但似乎为其他人解决的问题,例如运行aspnet_regiis -i,对我没什么影响。我调试了我的处理程序,它在使用GET时打破了我的处理程序的ProcessRequest()方法但是在使用PUT时它没有中断它因此我知道它甚至没有被调用。由于某种原因,这个其他核心模块未通过呼叫。

编辑:

我对执行POST的同一个URL执行了一个curl命令。所以GET和POST对我的http处理程序起作用,PUT没有。我还将相同的--upload-file curl命令执行到由WebDAV支持的同一个框上的URL,并且该命令有效。

谢谢, 尼克

1 个答案:

答案 0 :(得分:1)

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

runManagedModulesForWebDavRequests

阅读以下文档时:

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

我将其设置为true

<modules runManagedModulesForWebDavRequests="true">

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