Angular中的自定义项目没有使用Web API

时间:2015-10-11 02:14:11

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

我将以下请求发送到我的本地Web API服务。

 $http.defaults.headers.common.something = 'anything';
       $http({
        method: 'GET',
        url: 'http://localhost/FantasyTradeAnalyzer/api/home/ListLeagues',

    })
    .success(function (data)
    {
      $http.defaults.headers.common.something = undefined;
    });

我的Web Api服务中的以下代码

  [AcceptVerbs("GET")]
    public LeaguesViewModel ListLeagues(HttpRequestMessage request)
{
    var re = Request;
    var headers = re.Headers;
    if (headers.Contains("something"))
    { //do stuff }
}

但是,当我查看Fiddler(以及C#调试器)时,我看不到我在Header中发送的自定义字段。我在这里错过了什么?这两件事(Angular和Web Api)都托管在我的本地IIS,不同的网站上。

1 个答案:

答案 0 :(得分:1)

有趣的是,向您的URI添加显式协议(http)将导致您的标头无法添加。此外,您应该使用"标题" config中的选项,它作为对象传递给$http。将配置选项传递给配置是多余的,并且不起作用,因为您已经配置对象中。

angular.module('app', [])
    .controller('TestCtrl', function($http) {
        $http({
            method: 'GET',
            url: 'www.google.com/test',
            headers: { 'something': 'anything' } 
        })
        .success(function (data)
        {});

});

JSFiddle Example

或者,您可以在.get()上使用简写$http方法。

$http.get(www.google.com/test', { 
    'something': 'anything' } 
)

值得注意的是一些警告:

如果您正在根据自定义标头执行任何类型的更新或更改,您应该发送POST或PATCH,因为存在副作用,而您不仅仅是只是检索数据,有时GET需要并且应该使用自定义标头发送。

这会替换所有标头,因此您需要重新添加所需的任何适用标头,因为它根据documentation充当覆盖。

  

此外,您可以在config对象中提供headers属性   调用$ http(config)时传递,它会覆盖默认值   没有全局改变它们。

最后,如果您想避免删除默认标头,另一个选项是全局修改该标头的默认值,尽管您希望在请求后删除它。这很笨拙,但它不需要您手动重建标题。

angular.module('app', [])
    .controller('TestCtrl', function($http) {
        $http.defaults.headers.common.something = 'anything';

        $http({
            method: 'GET',
            url: 'www.google.com/test' 
        })
        .success(function (data) {
            $http.defaults.headers.common.something = undefined;
        });
});

要在WebAPI方法中检索标题:

var foo = request.Headers.GetValues("test").FirstOrDefault();