【问题标题】:Web API 2 - IIS7 POST method. 405 - not allowed after trying all possible solutions I could findWeb API 2 - IIS7 POST 方法。 405 - 在尝试了我能找到的所有可能的解决方案后不允许
【发布时间】: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


    【解决方案1】:

    我一直假设“不允许”来自 IIS,看来我错了。

    我的 Post 方法有一个字符串类型的参数。我假设我的路由属性不包含如下所示的参数,该参数将从请求正文中获取。

    [Route("Test")]
    [HttpPost]
    public string Post(string text)
    

    为了看看发生了什么,我在这个参数中添加了一个 [FromBody] 属性。令我惊讶的是,我收到的是 415 错误而不是 405。

    415错误的研究把我带到了这个链接:

    https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

    该链接告诉我字符串参数应该是 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 问题。

    如果我的程序无法运行,我会另开一个案例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 2021-06-18
      • 2015-10-07
      • 2014-12-26
      • 2016-04-18
      • 2021-09-30
      相关资源
      最近更新 更多