发布请求odata与cors

时间:2018-02-27 20:12:16

标签: c# cors odata angularjs-http

我正在使用c#(.net framework)和odata V4编写一些服务。我的客户是AngularJs。 在我的localhost上,everythink工作正常,但是当我将我的代码发布到服务器(widows server 2012 R2)时,我遇到了问题。 我尝试了不同的解决方案:

  1. 试图将Access-Control-Allow-Origin,Access-Control-Allow-Headers,Access-Control-Allow-Methods,Access-Control-Allow-Credentials放在web.config上,得到401500回复预检。

  2. 添加CorsHandler类来处理预检/添加Application_BeginRequest来处理它,没有运气(返回那里的Access-Control-Allow-Origin等等)。和来自这里的东西: Handling CORS Preflight requests to ASP.NET MVC actions

  3. 最后尝试了Microsoft.AspNet.WebApi.Cors包:

     var cors = new EnableCorsAttribute("cool.mydomain", "*", "*");
        config.EnableCors(cors);
    

    猜猜看,它没有任何帮助!

    当我发送POST方法时,我必须使用Content-Type:"x-www-form-urlencoded"发送,因为application/json触发了预检,并且由于某种原因不支持text/plain。我有假设由于urlencoded的内容类型,使用ODataActionParameters对象并且它始终为null的enpoint。

    希望有人可以帮助我,我正在敲打我的脑袋......

1 个答案:

答案 0 :(得分:0)

在再次检查戴安娜的链接之后,我做到了。但我做了改变。我为每个请求返回Access-Control-Allow-OriginAccess-Control-Allow-Credentials,如果是OPTIONS请求,我会返回剩余的标题:

 protected void Application_BeginRequest()
            {
                Context.Response.AddHeader("Access-Control-Allow-Origin", ORIGINS);
                Context.Response.AddHeader("Access-Control-Allow-Credentials", "true");
                if (Context.Request.HttpMethod == "OPTIONS")
                {                    
                    Context.Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
                    Context.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST PUT, DELETE, OPTIONS");                    
                    Context.Response.End();
                }
            }