【问题标题】:CORS implementation in WEBAPI - .net framework 4.0WEBAPI 中的 CORS 实现 - .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 吗?

【问题讨论】:

    标签: .net asp.net-web-api 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(...) 上引发 StackOverFlow 异常。你有解决这个问题的想法吗??
    • 嘿,尝试只使用上面的这些返回语句之一。如您所见,第一个将标题一起返回,而另一个则不返回。让我知道你的意见。干杯
    【解决方案2】:

    需要 .NET Framework 4.5 和 Visual Studio/Express 2014 的 Web API 2 支持 CORS 包。

    它不适用于 Web API 1(与 .NET 4.0 一起使用)

    请参考this thread

    【讨论】:

    • 如果您在此处包含来自给定线程的一些重要信息会更好。
    猜你喜欢
    • 2018-06-01
    • 2014-04-04
    • 2011-01-26
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多