为什么我不能在Web Api中获得标题?

时间:2014-02-11 11:01:23

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

我经常搜索,无法弄清楚我错过了什么。

我正在尝试在ajax调用中发送标头:

        $.ajax({
            type: "GET",
            url: url,
            dataType: 'jsonp',
            headers: { "Authorization": "98765", "X-My-Secret-Token": "WhyCantIGetThis", "JustAnotherTest": "314987" },
            //beforeSend: function (request) {
            //    request.setRequestHeader("Authorization", "98765"); -> I tried this way too
            //},
            success: function (data) {
                $('#value1').html(data);
            }
        })

然后进入:

       public override void OnActionExecuting(HttpActionContext actionContext)
       {
            var header_X_My_Secret_Token = actionContext.Request.Headers.SingleOrDefault(x => x.Key == "X-My-Secret-Token");
            var header_Authorization = actionContext.Request.Headers.SingleOrDefault(x => x.Key == "Authorization");
            var header_JustAnotherTest = actionContext.Request.Headers.SingleOrDefault(x => x.Key == "JustAnotherTest");

            var heeder_Authorization2 = actionContext.Request.Headers.Authorization;
        }

但它全都是空的。有谁能告诉我为什么?谢谢。 [编辑]

我可以在同一个域中获取标头ajax调用。但我也需要在跨域中获取它。怎么样?感谢

3 个答案:

答案 0 :(得分:5)

你可以尝试这个,在我的情况下它的工作。

IEnumerable<string> values = new List<string>();
actionContext.Request.Headers.TryGetValues("Authorization", out values);

答案 1 :(得分:2)

在您可以在跨域请求中发送标头之前,chrome将使用CORS来确定可以发送哪些标头。要使浏览器能够发送您想要的标题,您可以向控制器添加OPTIONS方法。

   public HttpResponseMessage Options()
    {

        var response = new HttpResponseMessage();
        response.Headers.Add("Access-Control-Allow-Headers", Request.Headers.GetValues("Access-Control-Request-Headers").FirstOrDefault() );
        response.Headers.Add("Access-Control-Allow-Origin", "*");
        response.Headers.Add("Access-Control-Allow-Method", "GET");
        return response;
     }

答案 2 :(得分:1)

对于仍在寻找答案的人......

我只需要启用CORS:

  

安装包Microsoft.AspNet.WebApi.Cors

using System.Web.Http;
namespace WebService
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            EnableCors(); \\<==============

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

http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api