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 WebAPI CORS 不工作

如何在 Asp.Net Core 3.0 WebAPI 中启用 CORS

将 CORS 迁移到 WebAPI 中的代码背后的动机是啥?

为 ASP .NET MVC 中的静态资源启用 CORS?

在 .net 核心 webAPI 中启用 CORS

为 Web API 1、.net 4.0 启用 CORS 中的问题