【发布时间】:2017-10-25 10:54:33
【问题描述】:
我的测试应用程序是使用 Vs 2013 Web 应用程序空模板使用 Web Api 开发的。
这是我的路由初始化的样子:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
config.EnableCors();
// Web API routes
config.MapHttpAttributeRoutes();
}
}
这是我的控制器的样子:
[EnableCors(origins: "*", headers: "*", methods: "*")]
public class TestController : ApiController
{
[Route ("Test")]
[HttpGet]
public string Get()
{
return "Response to get Request";
}
[Route("Test")]
[HttpPost]
public string Post(string text)
{
return string.Format("Received: '{0}'", text);
}
}
这是我的 web.config 文件在包含所有建议的修复后的样子:
<system.web>
<compilation debug="true" targetFramework="4.5.1" />
<httpRuntime targetFramework="4.5.1" />
<webServices>
<protocols>
<add name="HttpGet" />
<add name="HttpPost" />
<add name="HttpPut" />
<add name="HttpDelete" />
</protocols>
</webServices>
</system.web>
<system.webServer>
<handlers>
<remove name="WebDAV" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<security>
<requestFiltering>
<verbs allowUnlisted="false">
<add verb="GET" allowed="true" />
<add verb="POST" allowed="true" />
<add verb="DELETE" allowed="true" />
<add verb="PUT" allowed="true" />
</verbs>
</requestFiltering>
</security>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
</modules>
</system.webServer>
我已经使用 IIS 管理器验证了我的应用程序的处理程序映射和请求过滤,并且 POST 动词显示为已启用。
我跟踪了 ISS 拒绝的请求,发现 ManagedPipeLineHandler 设置了 405 错误,如下所示:
ModuleName ManagedPipelineHandler
通知 128
HttpStatus 405
HttpReason 方法不允许
HttpSubStatus 0
错误代码 0
配置异常信息
通知 EXECUTE_REQUEST_HANDLER
ErrorCode 操作成功完成。 (0x0)
我的假设是请求不会发送到我的应用程序。我对么?
我一直在使用 Fiddler 进行测试,发现响应标头中有一个名为“Security”的部分,其中有一行内容为“Allow: GET”,这可能解释了 Get 有效但 POST 无效的原因。
这些信息从何而来?这个问题的答案可能会引导我找到解决方案。
我花了很多时间试图解决这个问题,但没有成功。任何反馈将不胜感激。
【问题讨论】:
标签: asp.net-web-api iis-7 http-post