为 Web API 1、.net 4.0 启用 CORS
Posted
技术标签:
【中文标题】为 Web API 1、.net 4.0 启用 CORS【英文标题】:Enable CORS for Web API 1, .net 4.0 【发布时间】:2014-12-17 20:02:18 【问题描述】:我需要为我的 Web API 启用 CORS,但目前无法升级到 Framework 4.5。 (我知道 System.Web.Http.Cors.EnableCorsAttribute。)
我尝试将以下内容添加到我的 Web.config 以查看它是否有效,但没有:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*"/>
</customHeaders>
</httpProtocol>
我还尝试使用 System.Web.Http.Filters.ActionFilterAttribute 手动将 Access-Control-Allow-Origin 标头设置为“*”(基于这篇文章:Add custom header to all responses in Web API) - 但那没有也不能解决,因为请求在进入操作过滤之前被拒绝。
所以我现在有点卡住了。感谢任何帮助。
编辑:结果
<add name="Access-Control-Allow-Origin" value="*"/>
一直是答案,我之前测试它时一定做错了什么。但是这个解决方案意味着所有操作都启用了 CORS(现在可以)。
【问题讨论】:
The requested resource does not support http method 'GET'. Error Code 405的可能重复 @ArindamNayak 该线程中接受的答案似乎需要.NET Framework 4.5。 做一件事,按照那里回答中提到的步骤,你可能需要搜索 .net 4 nuget 包才能使其工作。注意:我已经在那里回答了,所以我不在这里回答,我的意思是不要复制它。 ***.com/questions/22143378/… - 这表示 WEB API 1 中不存在 CORS。- 也添加了我的答案! @ArindamNayak 谢谢,我会调查的。 【参考方案1】:POST、PUT、DELETE 等使用预飞行的 CORS。浏览器发送一个 OPTIONS 请求。这是因为浏览器首先检查服务器端是否可以使用OPTIONS
请求处理CORS,如果成功,则发送实际请求PUT
或POST
或Delete
。由于您没有处理 OPTIONS 的操作方法,因此您会得到 405。在最简单的形式中,您必须在控制器中实现这样的操作方法。
更多解释-http://www.w3.org/TR/cors/#resource-preflight-requests
http://www.html5rocks.com/en/tutorials/cors/
public HttpResponseMessage Options()
var response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
return response;
注意:此操作仅响应OPTION
请求,因此您需要向web.config
添加必要的配置,例如Access-Control-Allow-Origin = *
和Access-Control-Allow-Methods = POST,PUT,DELETE
。
Web API 2
支持 CORS,但使用 Web API 1,您必须遵循此路径。
【讨论】:
【参考方案2】:也尝试添加:
<add name="Access-Control-Allow-Headers" value="*" />
【讨论】:
在哪里添加这个,我尝试在 web config 中添加,但不起作用 @Md.ParvezAlam 将其添加到 web.config gist.github.com/walkermatt/637df93121a409faab6a 我正在从 jquery 访问方法,它是 web api -1 @Md.ParvezAlam 最好为此创建一个新问题,比如在这里讨论。 我创建了一个新帖子***.com/questions/36423740/…【参考方案3】:我在 webAPI 1 中遇到了很多问题,跨域访问终于能够修复它,看看我的博客 http://keerthirb.blogspot.in/2017/08/making-cross-enable-for-webapi1.html
交叉码是
public class CorsHandler : DelegatingHandler
const string Origin = "Origin";
const string AccessControlRequestMethod = "Access-Control-Request-Method";
const string AccessControlRequestHeaders = "Access-Control-Request-Headers";
const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";
const string AccessControlAllowMethods = "Access-Control-Allow-Methods";
const string AccessControlAllowHeaders = "Access-Control-Allow-Headers";
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
bool isCorsRequest = request.Headers.Contains(Origin);
bool isPreflightRequest = request.Method == HttpMethod.Options;
if (isCorsRequest)
if (isPreflightRequest)
return Task.Factory.StartNew<HttpResponseMessage>(() =>
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());
string accessControlRequestMethod = request.Headers.GetValues(AccessControlRequestMethod).FirstOrDefault();
if (accessControlRequestMethod != null)
response.Headers.Add(AccessControlAllowMethods, accessControlRequestMethod);
string requestedHeaders = string.Join(", ", request.Headers.GetValues(AccessControlRequestHeaders));
if (!string.IsNullOrEmpty(requestedHeaders))
response.Headers.Add(AccessControlAllowHeaders, requestedHeaders);
return response;
, cancellationToken);
else
return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>(t =>
HttpResponseMessage resp = t.Result;
resp.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());
return resp;
);
else
return base.SendAsync(request, cancellationToken);
【讨论】:
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review 我同意 所以我已经包含了交叉启用代码。欲了解更多信息,用户可以转到链接。以上是关于为 Web API 1、.net 4.0 启用 CORS的主要内容,如果未能解决你的问题,请参考以下文章
基于.Net Framework 4.0 Web API开发:ASP.NET Web APIs 基于令牌TOKEN验证的实现
如何在 ASP.Net Web API 中为特定控制器启用 Windows 身份验证
基于.Net Framework 4.0 Web API开发:ASP.NET Web APIs AJAX 跨域请求解决办法(CORS实现)
基于.Net Framework 4.0 Web API开发:ASP.NET Web APIs 异常的统一处理Attribute 和统一写Log 的Attribute的实现