WebAPI OWIN SelfHosting CORS 支持
Posted
技术标签:
【中文标题】WebAPI OWIN SelfHosting CORS 支持【英文标题】:WebAPI OWIN SelfHosting CORS support 【发布时间】:2017-01-03 02:41:23 【问题描述】:我正在使用 Microsoft.AspNet.WebApi V5.2.3、Microsoft.Owin.Host.HttpListener 3.0.1。从以下配置开始:
public void Configuration(IAppBuilder appBuilder)
HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
appBuilder.UseWebApi(config);
API 控制器类声明使用:
[EnableCors("*", "*", "*")]
public class CWebAPIController : ApiController
[Route("API/System/Login"), HttpGet]
public IHttpActionResult Login(string UserID, string Password)
.... bla bla bla .....
我可以在同一台计算机上使用 HttpClent 调用上述 API,但如果我尝试从另一台计算机(同一子网内)调用 API,我会收到 400 BadRequest 响应。
我相信这是 CORS 问题,但我想知道如何解决这个问题。在 google 中搜索会产生很多结果,并且 WebApi 的版本/实现太多了,尝试了一整天后我不知道哪个是正确的。
提前致谢
【问题讨论】:
【参考方案1】:我添加了这样的cors:
public void Configuration(IAppBuilder app)
var config = ConfigureApi();
app.UseWebApi(config);
private HttpConfiguration ConfigureApi()
var config = new HttpConfiguration();
config.Routes.MapHttpRoute(
"DefaultApi",
"controller/action/id",
new id = RouteParameter.Optional );
config.MessageHandlers.Add(new CorsMessageHandler ());
return config;
CorsMessageHandler 出现在这里: https://github.com/Microsoft/FetchClimate/blob/master/src/Service/Frontend/CORS/CorsMessageHandler.cs
希望它会起作用。
【讨论】:
【参考方案2】:对于自托管,我们需要在管理员模式下运行以下命令。
netsh http add urlacl url=http://+:<port>/ user=<user id>
【讨论】:
【参考方案3】:EnableCors 属性应该适用于您的 API 控制器。或者,您可以执行以下操作之一。
如果您想允许从任何计算机访问,那么您可以使用
appBuilder.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
否则,如果您想控制允许使用的域/计算机,则使用
var cors = new EnableCorsAttribute("www.example.com", "*", "*");
config.EnableCors(cors);
您需要安装 Microsoft.Owin.Cors 包。
【讨论】:
【参考方案4】:您需要将 Microsoft.Owin.Cors 包,也许还有 Microsoft.AspNet.Cors 包引入您的项目,并在您的 Startup
类中初始化 CORS,如下所示:
var corsPolicy = new CorsPolicy
AllowAnyHeader = true,
AllowAnyMethod = true,
AllowAnyOrigin = true,
SupportsCredentials = true
;
corsPolicy.ExposedHeaders.Add("x-markit-currentpage");
corsPolicy.ExposedHeaders.Add("x-markit-totalpages");
corsPolicy.ExposedHeaders.Add("x-markit-totalresults");
app.UseCors(new CorsOptions
PolicyProvider = new CorsPolicyProvider PolicyResolver = context => Task.FromResult(corsPolicy)
);
【讨论】:
以上是关于WebAPI OWIN SelfHosting CORS 支持的主要内容,如果未能解决你的问题,请参考以下文章
WebApi 上的 AngularJS 和 OWIN 身份验证
WebApi.Owin 中的 SuppressDefaultHostAuthentication 也抑制 webapi 外部的身份验证