如何在服务器端设置Web Api请求标头

时间:2012-12-18 02:11:50

标签: asp.net asp.net-mvc asp.net-web-api

我正在尝试使用MVC根据HTTP调用WebApi方法。我需要每次都发送一些信息,比如userID和app版本。如何将此信息添加到标题中?我希望将其作为ajax调用,而不是像现在这样的客户端代码):

      'beforeSend: function (req) {
                req.setRequestHeader("Accept", "version=1.00,requestTime=" + new Date());
            }'

但是在服务器端,我无法使用字符串设置RequestHeader 这是我的服务器代码:

 HttpClient client = new HttpClient();
 var request = new HttpRequestMessage()
        {
            RequestUri = new Uri("http://localhost/WebAPIDemo/FilterAttribute-MVC"),
            Method = HttpMethod.Get,
        };

        request.Headers.Accept.Add(***);
        //request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        List<OfficeSupply> os=new List<OfficeSupply>();
        var task = client.SendAsync(request)
            .ContinueWith((taskwithmsg) =>
            {
                var response = taskwithmsg.Result;

                var jsonTask = response.Content.ReadAsAsync<List<OfficeSupply>>();
                jsonTask.Wait();
                var jsonObject = jsonTask.Result;
                os = jsonObject.ToList();
            });
        task.Wait();

***需要是'MediaTypeWithQualityHeaderValue'类型值,但我只想将其设置为自定义,如ajax调用。我该怎么办?

另外,我想更改Header Authorization参数,但是这段代码:

 'client.DefaultRequestHeaders.Add("Authorization", "12345");' 

无法正常工作

  request.Headers.Authorization.Parameter

告诉我它是只读的。

如何在发送之前在服务器端设置它?

2 个答案:

答案 0 :(得分:2)

您可以通过执行类似

的操作来指定自定义身份验证方案
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("scheme","whatever parameters");

您可以使用以下代码设置完全自定义标头:

request.Headers.TryAddWithoutValidation("foo", new List<string>() {"sdadads"});

但请注意,上面显示的接受标题示例完全无效。关于如何格式化接受标题的内容并且您的示例无效,有非常精确的规则。

答案 1 :(得分:0)

我曾经按照以下方法设置请求标头。如果适合你,请试试。

[脚本]

 $("#Grid1").ajaxSuccess(function (evt, request, settings) {
    $('.Status').html(request.getResponseHeader("Status"));
  });

[查看]

  <h2>Status:</h2><h2 class="Status" style="color:Red;">

[控制器]

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Save(Order orders)
    {
        string status = string.Empty;

        if (orders != null)
        {
            OrderRepository.Update(orders);
            status = "Updated";
        }

        Response.AddHeader("Status", status);            
        return data.GridActions<EditableOrder>();
    }

Response header