我正在编写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,并且该命令有效。
谢谢, 尼克
答案 0 :(得分:1)
好吧,我继续搜索,在查看配置的文档时,我看到了以下内容:
runManagedModulesForWebDavRequests
阅读以下文档时:
https://www.iis.net/configreference/system.webserver/modules
我将其设置为true
<modules runManagedModulesForWebDavRequests="true">
瞧,PUT现在适用于我的http处理程序。我想一旦你安装了WebDAV,那么所有PUT都与WebDAV相关联?我不知道,但看起来就是这样。因此,如果您安装了WebDAV,则需要禁用它,然后将此标志设置为true。