【问题标题】:Safari and CORS: Custom Response Headers disappearSafari 和 CORS:自定义响应标头消失
【发布时间】:2014-10-10 08:26:34
【问题描述】:

我已经尽可能简单地重新创建了我的错误,它是这样的:

我有一个 c# Web Api 项目,并安装了 CORS Web Api nuget 包。然后我将它添加到 WebApiConfig.cs 的注册函数中:

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

然后我创建了一个非常简单的“GetToken”api,粘贴在下面:

[Route("~/api/auth/token")]
public HttpResponseMessage GetToken()
{
    var result = new
    {
        FirstName = "matt"
    };
    var response = Request.CreateResponse(HttpStatusCode.OK, result);
    HttpContext.Current.Response.Headers.Set("Access-Control-Allow-Headers", "Authorization");
    HttpContext.Current.Response.Headers.Set("Access-Control-Expose-Headers", "Authorization");
    HttpContext.Current.Response.Headers.Set("Authorization", "test");

    //HttpContext.Current.Response.Headers.Set("Access-Control-Allow-Methods", "GET, OPTIONS");
    //HttpContext.Current.Response.Headers.Set("Access-Control-Allow-Credentials", "true");
    //HttpContext.Current.Response.Headers.Set("Access-Control-Allow-Origin", "http://run.plnkr.co/");
    return response;
}

注释掉的代码只是我用来尝试解决此问题的许多 Header 配置组合中的一部分。在 web api 之后,我在 plunker 中创建了一个非常基本的 api 调用:

var Test1 = function() {
    $.ajax("http://localhost:61826/api/auth/token", {
        type: "GET",
        success: function(data, status, xhr) {  
            debugger;
        },
        error: function(err) {
            debugger;
        },
        crossDomain: true
    });
}

我还创建了一个 Angular 版本,如果有人需要,我会分享。

最终结果。在 chrome 中,它工作得非常好,你可以在这里看到(授权标头在那里):

但在 Safari 中它不起作用,正如您在此处看到的(缺少授权标头):

这几天我一直在碰壁,现在是时候引入社区了。谁能告诉我这是怎么回事?

【问题讨论】:

  • 你找到答案了吗?

标签: ajax safari cors asp.net-web-api


【解决方案1】:

嘿,而不是手动设置公开标头,您是否尝试过这样做

//set in the webapiconfig
config.EnableCors(new EnableCorsAttribute("*", "*", "*", "Authorization"));   

[Route("~/api/auth/token")]
public HttpResponseMessage GetToken()
{
var result = new
{
    FirstName = "matt"
};
var response = Request.CreateResponse(HttpStatusCode.OK, result);
response.Headers.Add("Authorization", "test");
return response;
}

【讨论】:

  • 您好,开发人员,感谢您的回复。我刚刚尝试了您的建议,但没有运气。相同的行为(chrome 很好,safari 标题根本不出现)。
  • 您是否查看了网络选项卡,您是否在响应标头中看到了它?
  • 还有两件事要尝试 1) 尝试在 js 中执行 getResponseHeader("Authorization") 而不是全部获取 2) 如果响应正文为空,请尝试在响应正文中添加内容 3) 尝试绕过 jquery 并使用常规js 发出请求。我怀疑这是客户端问题
  • 您好,开发人员,再次感谢您的快速回复。有趣的是,Safari 网络选项卡确实选择了 Authorization 标头。它只是没有被 ajax 成功函数消化。我试过只做 getResponseHeader("Authorization"),但没有运气。我在响应正文中添加了一些内容,然后就被采纳了。我现在正在绕过jquery。我会尽快发布结果。
  • 嗨,开发者,我尝试绕过 jquery,但仍然没有运气。标题不出现。我用来绕过jquery的代码在这里:plnkr.co/edit/HVf8HvEunTbW2TVQRc9T?p=preview
猜你喜欢
  • 2013-07-08
  • 2016-07-24
  • 2015-05-14
  • 2013-08-27
  • 2020-09-10
  • 2016-04-05
  • 2017-08-21
  • 2022-10-24
  • 1970-01-01
相关资源
最近更新 更多