Cors 中启用的所有标头,WebConfig 和 WebApiConfig 之间没有冲突,为啥我的 WebApi 返回 405 错误?

Posted

技术标签:

【中文标题】Cors 中启用的所有标头,WebConfig 和 WebApiConfig 之间没有冲突,为啥我的 WebApi 返回 405 错误?【英文标题】:All headers enabled in Cors, no conflicts between WebConfig and WebApiConfig, why is my WebApi returning a 405 error?Cors 中启用的所有标头,WebConfig 和 WebApiConfig 之间没有冲突,为什么我的 WebApi 返回 405 错误? 【发布时间】:2016-06-23 23:14:15 【问题描述】:

我尝试了其他帖子中的最佳答案,但没有成功,尽管我尽了最大努力,但似乎只允许 GET 和 POST。我唯一能想到的是IIS问题?正如您可能会说的那样,我对此并不陌生。

**Response Header**

访问控制允许来源:* 允许:GET、POST 缓存控制:无缓存 内容长度:82 内容类型:应用程序/json;字符集=utf-8 日期:格林威治标准时间 2016 年 3 月 9 日星期三 13:49:26 过期:-1 编译指示:无缓存 服务器:Microsoft-IIS/10.0 X-AspNet-版本:4.0.30319 X-Powered-By:ASP.NET X-SourceFiles:=?UTF-8BQzpcVXNlcnNcTWVcRGVza3RvcFxDb2RlXERldlxwbTJcUHJvcGVydHlNYW5hZ2VyMlxhcGlcdGVuYW50cw==?=

**Request Header**

接受:application/json、text/plain、/ 接受编码:gzip、deflate、sdch 接受语言:en-US,en;q=0.8 内容长度:105 内容类型:application/json;charset=UTF-8 主机:本地主机:62118 来源:http://localhost:54633 代理连接:保持活动 推荐人:http://localhost:54633/ 用户代理:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/49.0.2623.75 Safari/537.36

public static class WebApiConfig

    public static void Register(HttpConfiguration config)
    
        // Web API configuration and services
        var cors = new EnableCorsAttribute(
              origins: "*",
              headers: "*",
              methods: "*"
          );

        config.EnableCors(cors);

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/controller/id",
            defaults: new  id = RouteParameter.Optional 
        );

        SetupAutomapper();

        var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
        config.Formatters.Remove(config.Formatters.XmlFormatter);
        json.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
    


    private static void SetupAutomapper()
    
        Mapper.CreateMap<Property, PropertyModel>();
        Mapper.CreateMap<Tenant, TenantModel>();
        Mapper.CreateMap<Lease, LeaseModel>();
    

还有我的控制器

// PUT: api/Tenants/5
    [ResponseType(typeof(void))]
    public IHttpActionResult PutTenant(int id, TenantModel tenant)
    
        if (!ModelState.IsValid)
        
            return BadRequest(ModelState);
        

        if (id != tenant.TenantId)
        
            return BadRequest();
        

        var dbTenant= db.Tenants.Find(id);

        dbTenant.Update(tenant);

        db.Entry(dbTenant).State = EntityState.Modified;

        try
        
            db.SaveChanges();
        
        catch (DbUpdateConcurrencyException)
        
            if (!TenantExists(id))
            
                return NotFound();
            
            else
            
                throw;
            
        

        return StatusCode(HttpStatusCode.NoContent);
    

最后,web.config

    <?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=301879
  -->
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <appSettings></appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2" />
  </system.web>
  <system.webServer>
    <handlers>
      <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>
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

【问题讨论】:

你安装了WebDAV吗? 我在我的解决方案中的任何地方都找不到 WebDav,没有。 WebDav 是一个可以安装在您的计算机上的程序。请检查并卸载 【参考方案1】:

尝试更改您的 IIS 配置。

打开%USERPROFILE%\Documents\IISExpress\config文件夹中的applicationHost.config。

handlers部分找到ExtensionlessUrl

在动词属性中添加PUT

结果应该是这样的:

<add name="ExtensionlessUrl-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT"....

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT" ...

【讨论】:

不走运,这应该是我正在编辑的仅有的两行吗?我看到很多 verb="GET,HEAD,POST,DEBUG" @TJTJ 是的,只有 2 行,然后尝试重新启动您的 IIS

以上是关于Cors 中启用的所有标头,WebConfig 和 WebApiConfig 之间没有冲突,为啥我的 WebApi 返回 405 错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CORS 启用自定义标头?

响应标头中的 Azure 无服务器功能启用 CORS

无法使用 cors 从 angular 2 获取所有响应标头

在 .NET Core Web API 上为 CORS 启用 OPTIONS 标头

如何启用 CORS 的 Apache Web 服务器(包括预检和自定义标头)?

使用 Spring MVC 为所有 API 启用 CORS