在Asp.net Web API中处理CORS预检
我的架构中有三个应用程序。
它们位于同一台服务器上,但具有不同的端口号。
A - Token Application (port 4444) - Asp.net WebApi B - API Application (port 3333) - Asp.net WebApi C - UI Application (port 2222) - AngularJS App.
申请流程如下
1- UI项目从令牌应用程序获取令牌(它需要Windows awxrsdsaWeffs12da
validation。)例如: awxrsdsaWeffs12da
2- UI应用程序将此标记放入自定义标头,该标头名为“accessToken”
例如:accessToken: awxrsdsaWeffs12da
3- UI应用程序向API Application Ex发送请求: http:myaddress:3333/api/TheRestServiceHere
UI应用程序获得401错误。 哪个发送OPTIONS方法。 (我想预检问题)
在我的web api项目中,我启用了如下所示的Cors。
public static void Register(HttpConfiguration config) { .... //CORS var cors = new EnableCorsAttribute("*", "*", "*"); config.EnableCors(cors); .... }
配置
public static class WebApiConfig { public static void Register(HttpConfiguration config) { //CORS var cors = new EnableCorsAttribute("*", "*", "*"); config.EnableCors(); // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.None; json.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; json.SerializerSettings.Formatting = Formatting.None; json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); config.Formatters.Remove(config.Formatters.XmlFormatter); } }
所以我正在寻找一个解决方案来调用API应用程序(B)控制器并得到200 🙂
问候
我通过创建一个响应使用OPTIONS动词的请求的模块来修复我正在处理的应用程序。 您可能应该稍微修改它以包含应用程序请求的动词和内容类型。 在我的情况下,我决定将所有内容发布为JSON(需要进行飞行前检查)。 该模块如下:
public class OptionsModule : IHttpModule { public void Init(HttpApplication context) { context.BeginRequest += (sender, args) => { var app = (HttpApplication) sender; if (app.Request.HttpMethod == "OPTIONS") { app.Response.StatusCode = 200; app.Response.AddHeader("Access-Control-Allow-Headers", "content-type"); app.Response.AddHeader("Access-Control-Allow-Origin", APISettings.ApplicationOrigin); app.Response.AddHeader("Access-Control-Allow-Credentials", "true"); app.Response.AddHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS"); app.Response.AddHeader("Content-Type", "application/json"); app.Response.End(); } }; } public void Dispose() { } }
然后你需要在你的web.config中注册它:
您可能想要做的另一件事是明确指定允许的原点。 Chrome不喜欢那里有通配符。
我的一位朋友使用OPTIONSVerbHandler解决了这个问题。
当UI应用程序想要使用GET方法时,浏览器首先将OPTION方法发送到服务器(Preflight)。 然后,如果Preflight请求正常,则发送GET请求。
对于CORS测试目的,我们使用以下代码发送GET方法。
要处理在GET之前通过浏览器发送的OPTION方法,您应该进行以下设置。
1- Webconfig
2-使用以下设置添加OPTIONSVerbHandler
点击请求限制
3-我们的标题设置我们有accessToken ,您可以看到自定义
对于Azure环境
您需要来自门户网站的允许来源。
- 如何让Angular JS在Visual Studio 2015解决方案中工作?
- 从Razor(asp.net)迁移到Angular JS作为模板引擎
- C# – ObjectContext实例已被释放,不能再用于需要连接的操作
- 如何通过angularJS和webaAPI2下载内存流对象
- 从服务中的JavaScript HTML调用WCF服务
- AngularJS:如何获得系统远程?
- 如何设置ASP.NET API / AngularJS项目
- 使用ASP.Net MVC RouteConfig的AngularJS Ui-Router。 它是如何工作的?
- 通过Angular进行基本身份validation,为什么抛出错误401