无法 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。
我正在编写 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。