【发布时间】:2018-03-21 19:54:59
【问题描述】:
我在 Web API 上创建了一个 Web 服务,并尝试从 Angular 2 应用程序中使用它。 我安装 Microsoft.AspNet.WebApi.Core 5.2.3 并将其配置为允许 cors。 它托管在 localhost/RestfulAPI 的本地 IIS 上
WebApiConfig
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi 2",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var cors = new EnableCorsAttribute("*", "*", "*"); // origins, headers, methods
config.EnableCors(cors);
}
}
控制器
[HttpGet]
[Route("api/product/details")]
public async Task<IHttpActionResult> GetProductsDetails([FromUri]ProductSearch model)
{
using (var unitOfWork = Factory.Create())
{
var products = (from p in await unitOfWork.GetProductsAsync(model?.CategoryID, model?.BrandID, model?.ProductStateID, null, model?.PartnerID,
true, model?.Code)
orderby p.Code
select p).ToArray();
return return Json(products);
}
}
但我仍然在浏览器中遇到错误。
对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://localhost:12012' 不允许访问。响应的 HTTP 状态代码为 404。
怎么可能,我启用了所有的cors,但它仍然不起作用?
更新.1。 我尝试处理如下选项请求
public class PreflightRequestsHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (request.Headers.Contains("Origin") && request.Method.Method.Equals("OPTIONS"))
{
var response = new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
// Define and add values to variables: origins, headers, methods (can be global)
response.Headers.Add("Access-Control-Allow-Origin", "*");
response.Headers.Add("Access-Control-Allow-Headers", "*");
response.Headers.Add("Access-Control-Allow-Methods", "*");
var tsc = new TaskCompletionSource<HttpResponseMessage>();
tsc.SetResult(response);
return tsc.Task;
}
return base.SendAsync(request, cancellationToken);
}
}
但是得到一个错误:请求头字段 Content-Type 在预检响应中被 Access-Control-Allow-Headers 不允许。
【问题讨论】:
-
您确定这不在选项请求中吗?
-
如果是,有什么区别?在这种情况下如何启用它?
-
尝试将 EnableCors 移到方法的顶部,在一切之前。