Asp.net web api Web API 2-IIS7 POST方法。405-在尝试了所有可能的解决方案后,我发现这是不允许的

Asp.net web api Web API 2-IIS7 POST方法。405-在尝试了所有可能的解决方案后,我发现这是不允许的,asp.net-web-api,iis-7,http-post,Asp.net Web Api,Iis 7,Http Post,我的测试应用程序是使用VS2013 web应用程序空模板(使用web Api)开发的 这就是我的路由初始化的样子: public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API configuration and services config.EnableCors(); // Web AP

我的测试应用程序是使用VS2013 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);
    }
}
这就是我的控制器的外观:

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

配置例外信息

通知执行请求处理程序

错误代码操作已成功完成。(0x0)

我的假设是,请求不会进入我的应用程序。我说得对吗

我一直在使用Fiddler进行测试,我发现响应头有一个名为“Security”的部分,其中一行是“Allow:GET”,这可能解释了为什么GET可以工作,而POST不能工作

这些信息来自哪里?这个问题的答案可能会使我找到一个解决办法


我花了很多时间试图解决这个问题,但运气不好。任何反馈都将不胜感激。

我一直认为“不允许”来自IIS,似乎我错了

我的Post方法有一个字符串类型的参数。我假设如果我的route属性不包含如下面所示的参数,那么该参数将取自请求主体

[Route("Test")]
[HttpPost]
public string Post(string text)
为了看看发生了什么,我在这个参数中添加了一个[FromBody]属性。令我惊讶的是,我得到了一个415的错误,而不是405

415错误的研究将我带到了以下链接:

该链接告诉我字符串参数应该是uri的一部分,并且正文中随内容类型application/text发送的字符串没有默认格式设置程序

我将字符串参数封装在一个json对象中,如我的新控制器所示,现在POST工作了

[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(StringAsJson stringAsJason)
    {
        return string.Format("Received: '{0}'", stringAsJason.Value);
    }
}

public class StringAsJson
{
    public string Value { get; set; }
}
我回到我原来的程序,并试图做同样的,但我仍然得到405错误;不同之处在于,现在我知道这不是IIS问题

如果我的程序无法正常运行,我将打开另一个案例