将Http Headers添加到HttpClient

Rya*_*ter 147 c# asp.net-web-api dotnet-httpclient

所有:

在向Web服务发送请求之前,我需要将http标头添加到HttpClient.我如何为单个请求执行此操作(而不是将HttpClient应用于所有将来的请求)?我不确定这是否可行.

var client = new HttpClient();
var task =
    client.GetAsync("http://www.someURI.com")
    .ContinueWith((taskwithmsg) =>
    {
        var response = taskwithmsg.Result;

        var jsonTask = response.Content.ReadAsAsync<JsonObject>();
        jsonTask.Wait();
        var jsonObject = jsonTask.Result;
    });
task.Wait();
Run Code Online (Sandbox Code Playgroud)

Dar*_*ler 231

创建一个HttpRequestMessage,将方法设置为GET,设置标题,然后使用SendAsync而不是GetAsync.

var client = new HttpClient();
var request = new HttpRequestMessage() {
    RequestUri = new Uri("http://www.someURI.com"),
    Method = HttpMethod.Get,
};
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain"));
var task = client.SendAsync(request)
    .ContinueWith((taskwithmsg) =>
    {
        var response = taskwithmsg.Result;

        var jsonTask = response.Content.ReadAsAsync<JsonObject>();
        jsonTask.Wait();
        var jsonObject = jsonTask.Result;
    });
task.Wait();
Run Code Online (Sandbox Code Playgroud)

  • @Talon这就是406的含义.客户端要求服务器不支持的媒体类型.如果你不关心你得到什么媒体类型,那么不要问一个.OP只是询问如何向请求添加标头.我刚刚选了一个随机的例子. (22认同)
  • 这些天你可能想要`var response = await client.SendAsync`而不是`ContinueWith`和`task.Wait()` (12认同)
  • 谢谢,达雷尔!我对'HttpClient'感到失望,直到我看到你能做到这一点. (2认同)
  • 请注意,为了获得最佳性能,您不应像这样实例化 HTTP 客户端。您可以在此处阅读更多相关信息 /sf/answers/1099604341/ (2认同)

Tar*_*ran 10

如果它可以是所有请求的相同标头,或者在每个请求之后都处置客户端,则可以使用以下DefaultRequestHeaders.Add选项:

client.DefaultRequestHeaders.Add("apikey","xxxxxxxxx");      
Run Code Online (Sandbox Code Playgroud)

  • 我相信这会将标头添加到该 HttpClient 未来发送的所有消息中。这与 OP 的观点相矛盾:_“我如何为单个请求执行此操作(而不是在 HttpClient 上针对所有未来请求)?”_ HttpClient 实例旨在创建一次并多次使用。 (4认同)
  • 我以后如何更改此标头?如果我使用另一个 .Add("apikey","yyy"),它会变成“apikey: xxxxxxxxxyyy” (2认同)