为什么AngularJS Promise无法从WEB API响应中检索标头?

时间:2016-08-16 21:44:13

标签: c# angularjs asp.net-web-api

有人可以向我解释是否有可能从AngularJS Promise中的Web API响应中获取标头?

我正在拨打以下电话:

return $http({
        url: "http://localhost:19260/api/Authentication/Login/{credentials}",
        method: "POST",
        data: JSON.stringify(input),
        dataType: "json"
    }).then(function (response) {
        if (response.status === 200) {
            var jwt= response.headers('A‌​uthorization'); //Always null!!!!
            auth = true;
        }
        else {
            auth = false; 
        }
    }, function (response) {
        auth = false; 
    });

每次我尝试通过" response.headers(...)"值为null。为什么是这样?当我看到Fiddler中的响应时,我可以看到标题及其值。为什么AngularJS不能看到它?

这是CORS问题吗?客户端/服务器都在localhost上运行,但具有不同的端口。如果是这样,我的CORS实施有什么问题? (C#)

[EnableCors(origins: "*", headers: "*", methods: "*")]
public class AuthenticationController : ApiController
{
    [Route("api/Authentication/Login/{credentials}")]
    [HttpPost]
    public HttpResponseMessage Login([FromBody]CredentialContainer credentials)
    {
          var response = new HttpResponseMessage();
          var jwt = GetJwtToken(credentials);            
          response.Headers.Add("Authorization", jwt);
          response.StatusCode = HttpStatusCode.OK;
          return response;
    }

1 个答案:

答案 0 :(得分:0)

您的web api服务和网络服务器配置中可能没有考虑的两点:

<强>首先: 由于非默认标头值未显示给客户端(即授权和任何其他自定义标头),因此您可以通过在Web服务器(IIS Web.config)中设置某些配置来公开它们。您可以在Web.config中公开它们,例如:

<system.webServer>
   <httpProtocol>
     <customHeaders>
         <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization" />
         <add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS,PUT,DELETE" />
         <add name="Access-Control-Allow-Origin" value="*" />
     </customHeaders>
   </httpProtocol>
 </system.webServer>

如果你的gana为所有api设置了这些配置,这是最好的方法,不需要在每个方法的顶部添加enable-cors属性。另外在web.config中设置这些配置要容易得多,并且可以更好地工作(根据我的经验)。

<强>第二 您在ajax请求中未正确获取标头中的授权值。 请尝试使用此代码:

return $http({
        url: "http://localhost:19260/api/Authentication/Login/{credentials}",
        method: "POST",
        data: JSON.stringify(input),
        dataType: "json"
    }).success(function (response, status, headers, config) {
        if (response.status === 200) {
            //Try this one
            var jwt= headers('A‌​uthorization');
            auth = true;
        }
        else {
            auth = false; 
        }
    }).error(function (response, status, headers, config) {
        auth = false; 
    });

希望这可以帮助你兄弟。祝你好运。