web api路由无法启用CORS。

时间:2015-05-07 20:16:59

标签: asp.net-web-api cors asp.net-mvc-routing

我在我的web api应用程序中启用了CORS。我有API控制器,既有经典的REST函数名称,如Get()和Get(字符串id),也有一个带有自定义函数名称的控制器,例如: [HTTPGET] GetSomeThing()

我有像这样配置的路线

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

通过这种安排我得到一个错误No' Access-Control-Allow-Origin'当我尝试使用Classic REST函数调用控制器时,会出现标题。

e.g。 / API /控制器

如果我在路由之后采取行动而没有​​采取行动,它会在使用自定义函数名称的控制器调用上给出相同的错误。

e.g。 / API /控制器/功能

请注意我有

    [EnableCorsAttribute("http://localhost:xxxx", "*", "*")]
两个控制器上的

属性。这些调用是通过角度应用来完成的。

善意的建议。

2 个答案:

答案 0 :(得分: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>

此外,如果您通过NuGet安装CORS并使用以前版本的WebAPI,则可能需要将其卸载。 CORS将更新可能导致兼容性问题的某些核心WebAPI程序集,即路由无法正常工作。

当然,您可能希望通过替换&#34; *&#34;来限制允许的来源。在Access-Control-Allow-Origin值中包含您想要允许的URL。

答案 1 :(得分: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中删除了自定义标头。希望这可以帮助其他任何面临战队问题的人。