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=\"Web\" /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 从 angular 2 获取所有响应标头
在 .NET Core Web API 上为 CORS 启用 OPTIONS 标头