WEBAPI 中的 CORS 实现 - .net framework 4.0
Posted
技术标签:
【中文标题】WEBAPI 中的 CORS 实现 - .net framework 4.0【英文标题】:CORS implementation in WEBAPI - .net framework 4.0 【发布时间】:2014-04-17 22:44:24 【问题描述】:我对 webAPI 有点陌生,我想在 Web API 上实现 CORS(跨源资源共享)。我指的是这个Microsoft link。他们使用
安装 Nuget 包PM> Install-Package Microsoft.AspNet.Cors -Version 5.0.0-rc1 -Pre
但是,我使用的是 .NET Framework 4.0,但它无法正常工作。之后我使用了这个 Nuget 命令:
Install-Package Microsoft.AspNet.WebApi -Version 4.0.20710
但它不包含 CORS 类。那么,我们还有其他不同的方式来实现 CORS 吗?
【问题讨论】:
【参考方案1】:我使用以下内容并且工作正常(不确定“4.0 客户端配置文件”位):
public class CorsHandler : DelegatingHandler
private const string Origin = "Origin";
private const string AccessControlRequestMethod = "Access-Control-Request-Method";
private const string AccessControlRequestHeaders = "Access-Control-Request-Headers";
private const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";
private const string AccessControlAllowMethods = "Access-Control-Allow-Methods";
private 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)
var 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);
var tcs = new TaskCompletionSource<HttpResponseMessage>();
tcs.SetResult(response);
return tcs.Task;
return base.SendAsync(request, cancellationToken).ContinueWith(t =>
HttpResponseMessage resp = t.Result;
resp.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());
return resp;
);
return base.SendAsync(request, cancellationToken);
记得在你的 app start 中注册它(我在 global.asax 中)
GlobalConfiguration.Configuration.MessageHandlers.Add(new CorsHandler());
【讨论】:
我遇到了与 user3409920 描述的相同的问题。当我尝试您的解决方案时,它在if(isCorsRequest)
内的声明 return base.SendAsync(...)
上引发 *** 异常。你有解决这个问题的想法吗??
嘿,尝试只使用上面的这些返回语句之一。如您所见,第一个将标题一起返回,而另一个则不返回。让我知道你的意见。干杯【参考方案2】:
需要 .NET Framework 4.5 和 Visual Studio/Express 2014 的 Web API 2 支持 CORS 包。
它不适用于 Web API 1(与 .NET 4.0 一起使用)
请参考this thread。
【讨论】:
如果您在此处包含来自给定线程的一些重要信息会更好。以上是关于WEBAPI 中的 CORS 实现 - .net framework 4.0的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Asp.Net Core 3.0 WebAPI 中启用 CORS