2017-10-10 80 views
2

我在Web API上創建一個Web服務,並嘗試從angular 2應用程序使用它。 我安裝Microsoft.AspNet.WebApi.Core 5.2.3並將其配置爲允許cors。 它託管在本地IIS位於localhost/RestfulAPIweb api 2 cors不工作

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」標頭。因此不允許訪問原產地'http://localhost:12012'。該響應具有HTTP狀態代碼404.

這怎麼可能,我啓用所有Cors,但它仍然不工作?

Upd.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); 
      } 

     } 

但得到一個錯誤:請求頭字段內容類型不受接入控制允許的報頭預檢響應允許。

+0

您確定這不是選項要求嗎? –

+0

如果它是什麼區別?以及如何在這種情況下啓用它? –

+0

嘗試將EnableCors移到方法的頂部,然後再放在一切之前。 – jpgrassi

回答

0

確保您使用的是Api控制器,而不是從Apicontroller類繼承的普通控制器。 我有同樣的問題,然後我想通了,我使用普通的控制器,我糾正它,我無法訪問和從api控制器獲取數據。