CORS预检到WebAPI2没有返回正确的标头

时间:2016-10-31 20:05:37

标签: angularjs cors

我已经和CORS问题争了几天了,而且我被困了。我有一个有角度的应用程序试图做一个简单的HTTP Post of Json数据。

我已按照此处所述的路线前进:ASP.NET Web API - CORS Support in ASP.NET Web API 2使用自定义工厂,我已将我的web.config设置为:

    <handlers>
      <remove name="WebDAV"/>
      <remove name="OPTIONSVerbHandler"/>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>

我的$ http帖子:

            var serviceEndpoint = "https://mybox/ourservices/myservices/1.0.0.1/api/process";

        var requestData ={'FirstName':'Nick','LastName':'Jacobs'};

        $http({
            method: "POST",
            url: serviceEndpoint,
            withCredentials: true,
            data: requestData,
            headers: {
                'Content-Type': 'application/json',
                'Accept':'application/json'
            }
        })
        .success(function (data, status, headers, config) {
            // I need to pick off the user name from the JSON that's returned.
            console.log(data);
            deferred.resolve(data);
        })
        .error(function (data, status) {
            deferred.reject(data);
        });

问题是,我看到了服务器的飞行前请求,它传递了我的来源,并要求适当的标题,但我没有得到任何CORS响应标头。如果我进入web.config并添加允许方法,我确实看到回来了,但是因为我使用withCredentials然后我不能使用通配符起源响应头,我是希望上面MSDN文档中描述的工厂能够解决我的问题。

我缺少什么想法?

谢谢eveyrbody!

1 个答案:

答案 0 :(得分:0)

您需要在web api应用程序中配置CORS。 CORS有一个nuget包,基本上它是web api控制器中的一个属性,web api配置类中的一行配置就像config.EnableCors()。无需任何角度配置。 TKS

<强> MenusItemController.cs

[RoutePrefix("api/menus")]
[EnableCors(origins: "*", headers: "*", methods: "*")]
public class MenuItemsController : ApiController
{
    [Route("")]
    public IHttpActionResult Post()
    {
        return Ok(new
        {
            Result = "post menus"
        });
    }

    [Route("")]
    public IHttpActionResult Get()
    {
        return Ok(new
        {
            Result = "get menus"
        });
    }
}

<强> WebApiConfig.cs

public static void Register(HttpConfiguration config)
{
        // Web API configuration and services
        // Configure Web API to use only bearer token authentication.
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        config.EnableCors();

        // Web API routes
        config.MapHttpAttributeRoutes();

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

Nuget Packages

  • Microsoft.AspNet.WebApi.Cors
  • Microsoft.Owin.Cors
  • Microsoft.AspNet.Cors

我发布了我的应用并且运行良好。我没有做任何配置或角度请求参数。尝试在此处获取或发布:http://www.blocodecodigo.com.br/api/menus