【问题标题】:how to add header to GetAsync in httpclient如何在 httpclient 中将标头添加到 GetAsync
【发布时间】:2020-08-18 15:35:27
【问题描述】:

我要转换一个ps项目到C#,不熟悉C#中访问webapi的操作 下面是 PS 中的代码,它一直像魅力一样工作。

PowerShell 代码:

$api_key = [myKey]
$header = @{"x-api-key"=$api_key}
$uri = [myURI]
$resp = invoke-webrequest -uri $uri -method get -headers 

在 C# 中,我使用 HttpClient 和 GetAsync 方法来检索资源。我的问题是我不确定如何 将包含我的 apiKey 的标头插入网站。

我的代码是:

private static HttpClient _httpClient = new HttpClient();
var response = await _httpClient.GetAsync([myURI]);

由于请求不包含我的密钥,我收到 401 错误(未经授权的操作)。 我知道出了什么问题,但我不知道如何解决。我在 GetAsync 中看不到任何允许标题的地方。也许我应该使用不同的方法?

基本上,我想把上面的 PS sn-p 转换成 C# .netcore。

请指教。

【问题讨论】:

    标签: c# .net-core dotnet-httpclient webapi


    【解决方案1】:

    您应该使用HttpRequestMessage 模式来执行此操作。例如:

    using (var msg = new HttpRequestMessage(HttpMethod.Get, fromUri))
    {
        msg.Headers.Add("x-header-test", "the value");
        using (var resp = await _client.SendAsync(msg))
        {
            resp.EnsureSuccessStatusCode();
            return await resp.Content.ReadAsStringAsync();
        }
    }
    

    【讨论】:

    • 像魅力一样工作!就这样!谢谢你,安迪......非常感谢!
    【解决方案2】:

    使用 (var httpClient = new HttpClient()) {

    httpClient.DefaultRequestHeaders.Add("token", "sample token");
    JObject data = JObject.Parse(inputData);
    var content = new StringContent(JsonConvert.SerializeObject(data, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })); //using Newtonsoft.Json
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    
    var response = await httpClient.PostAsync(url, content).ConfigureAwait(false);
    
    await response.Content.ReadAsStringAsync().ContinueWith((Task<string> x) =>
    {
        if (!response.IsSuccessStatusCode)
        {
    
          throw new Exception(x.Result);
        }
        else
        {
          JObject output = x.Result;          
        }
    }
    

    }

    【讨论】:

    • 因为HttpClient 的头字典不是线程安全的,所以修改所述客户端的Default... 属性正逐渐成为一种不好的做法。另外,您使用 HttpClient 错误:aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
    • 如果你仍然热衷于使用 HttpClient,Andy 发布的文章实际上建议使用 HttpClient 的单个实例。这是因为每次创建此类的实例都会创建一个新连接,该连接在处理 HttpClient 对象后会持续约 240 秒。因此,使用 static 如:private static HttpClient Client = new HttpClient(); 并去掉 using 语句。
    • 感谢安迪的建议,如果我们使用“private static HttpClient Client = new HttpClient();”它适用于具有不同标头和不同 url 的并发请求吗?
    猜你喜欢
    • 2012-08-14
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    相关资源
    最近更新 更多