找不到Http 404

时间:2017-07-11 15:08:27

标签: asp.net http asp.net-web-api put

我正在研究ASP.NET Web API。我正在尝试使用Put http调用来更新某些资源。

我一直在寻找并且有很多可能的配置,但我无法为我找到合适的配置。

我按惯例使用端点。控制器上没有路由,只是我想要执行的函数的名称。

public IHttpActionResult Put([FromBody]JObject data)
{
    return this.ExecuteWithErrorHandling(() =>
    {
        return Ok();
    });
}

问题在于,当我从我的网络应用程序调用它时,首先调用OPTIONS。我得到405错误。

所以我发现如果从Web配置中删除OPTIONSVerbHandler和ExtensionlessUrlHandler-Integrated-4.0,我可以在选项调用中获得200.

   <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" /> <-- Remove this line -->
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />  <-- Remove this line -->
    </handlers>

但问题是,在此之后,当我在api上调用我的Put函数时,我得到404。

我正在使用IIS express。所以我去了IIS的配置文件,并在处理程序部分添加了缺少的动词。

<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />




<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

还要在Web配置中添加值以删除WebDAV

<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule" />
</modules>

<handlers>
      <remove name="WebDAV" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>

注意到当我从邮递员进行选项调用时,我没有看到Put方法。

Postman output

控制器完整代码:

using Newtonsoft.Json.Linq;
using Rev.API.Controllers.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace Rev.API.Controllers
{
    public class TestController : BaseApiController
    {
        public IHttpActionResult Get()
        {
            return this.ExecuteWithErrorHandling(() =>
            {
                int[] arr1 = new int[] { 3, 4, 5 }
                return Ok(arr1);
            });
        }

        public IHttpActionResult Get(string id)
        {
            return this.ExecuteWithErrorHandling(() =>
            {
                int Id = Convert.ToInt32(id);
                return Ok(Id);
            });
        }
        [System.Web.Http.HttpPut]
        public IHttpActionResult Put([FromBody]JObject data)
        {
            return this.ExecuteWithErrorHandling(() =>
            {
                return Ok();
            });
        }

    }
}

但问题仍然存在。不确定我错过了什么。

1 个答案:

答案 0 :(得分:0)

查看几个配置后,这是适用于我的配置。

  1. 从WebApiConfig
  2. 中删除了EnableCors

    2.在我的网络配置中,这是我的system.web服务器部门:

    `  <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
        <httpProtocol>
          <customHeaders>
            <add name="Access-Control-Allow-Origin" value="*" />
            <add name="Access-Control-Allow-Headers" value="Content-Type" />
            <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
          </customHeaders>
        </httpProtocol>
        <modules runAllManagedModulesForAllRequests="false"/>
        <handlers>
          <remove name="ExtensionlessUrl-Integrated-4.0" />
           <add name="ExtensionlessUrl-Integrated-4.0" 
               path="*." 
               verb="GET,HEAD,POST,DEBUG,DELETE,PUT" 
               type="System.Web.Handlers.TransferRequestHandler" 
               preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
      </system.webServer>`
    

    任何人都知道为什么添加ExtensionlessUrl-Integrated-4.0有效?

    谢谢!