Asp.net web api web api路由未在启用CORS的情况下工作。

Asp.net web api web api路由未在启用CORS的情况下工作。,asp.net-web-api,cors,asp.net-mvc-routing,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}/{act

我在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 }
        );
通过这种安排,当我尝试使用经典的REST函数调用控制器时,我得到一个错误,即不存在“Access Control Allow Origin”头

e、 g./api/控制器

如果我一个接一个地执行带有操作的路由,那么在使用自定义函数名进行控制器调用时会出现相同的错误

e、 g./api/控制器/功能

请注意,我有

    [EnableCorsAttribute("http://localhost:xxxx", "*", "*")]
两个控制器上的属性。这些调用是从角度应用程序发出的


好心的建议

也有同样的问题。通过将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程序集,即路由不工作


当然,您可能希望通过用您希望允许的URL替换Access Control Allow Origin值中的“*”来限制允许的来源。

我遇到了这个问题,我发现让cors工作是一场噩梦

最后,我的解决办法是删除我应用程序中对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);

    }
公共静态无效寄存器(HttpConfiguration配置)
{
config.EnableCors(新的EnableCorsAttribute(“*”,“*”,“GET,POST,OPTIONS,PUT,DELETE,TOKEN”);
//Web API路由
config.maphttpAttribute路由();
config.Routes.MapHttpRoute(
名称:“ActionApi”,
routeTemplate:“api/{controller}/{action}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“rest/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
var jsonFormatter=config.Formatters.OfType().First();
jsonFormatter.SerializerSettings.ContractResolver=新的CamelCasePropertyNamesContractResolver();
var json=config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling=Newtonsoft.json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);
}
我还从我的web.config中删除了自定义标题。希望这能帮助其他面临cors问题的人