2015-05-07 2 views
1

У меня есть CORS включен в моем приложении api для веб-приложений. и у меня есть контроллеры API с классическими именами функций REST, такими как Get() и Get (string id), и контроллерами с именами настраиваемых функций, например. [HttpGet] GetSomeThing()веб-маршруты api, не работающие с включенными CORS.

я есть маршруты, сконфигурированные как этот

config.EnableCors(); 
config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

       config.Routes.MapHttpRoute(
     name: "ApiById", 
     routeTemplate: "api/{controller}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
     ); 

с этим устройством я получаю сообщение об ошибке Нет 'Access-Control-Allow-Origin' заголовок присутствует, когда я пытаюсь позвонить контроллер с классическими функциями REST.

например./api/Controller

и если я выполняю маршрут с действием после маршрута без действий, он дает мне ту же ошибку при вызовах контроллера с именами пользовательских функций.

например./API/контроллер/функция

Обратите внимание, что у меня есть

[EnableCorsAttribute("http://localhost:xxxx", "*", "*")] 

атрибут на обоих контроллерах. и эти вызовы делаются из углового приложения.

добрый совет.

ответ

1

Был такой же вопрос. Исправлено, добавив заголовки CORS непосредственно в web.config. Никаких других изменений не требуется.

<system.webServer> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS" /> 
     <add name="Access-Control-Allow-Headers" value="content-type, accept, SOAPAction, origin" /> 
     </customHeaders> 
    </httpProtocol> 
    </system.webServer> 

Кроме того, если вы установили CORS через NuGet и использовали предыдущую версию WebAPI, то вам может понадобиться, чтобы удалить его. CORS обновит некоторые основные сборки WebAPI, которые могут вызвать проблемы совместимости, т. Е. Маршруты не работают.

И, конечно же, вы, вероятно, захотите ограничить разрешенное происхождение, заменив «*» в значении Access-Control-Allow-Origin с помощью URL-адреса, который вы хотите разрешить.

0

Я столкнулся с этой проблемой, и я нашел кошмар, чтобы заставить корс работать.

Исправление для меня в конце концов было удалить все ссылки на CORS в мое приложение и добавить только одну строку в WebAPIConfig

public static void Register(HttpConfiguration config) 
    { 
     config.EnableCors(new EnableCorsAttribute("*", "*", "GET, POST, OPTIONS, PUT, DELETE, TOKEN")); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "ActionApi", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "rest/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First(); 
     jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

     var json = config.Formatters.JsonFormatter; 
     json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; 
     config.Formatters.Remove(config.Formatters.XmlFormatter); 

    } 

Я также удалил пользовательские заголовки из моего web.config. Надеюсь, что эта помощь поможет кому-то, кто сталкивается с проблемами с корпорацией.