【问题标题】:HttpClient - sending a requestHttpClient - 发送请求
【发布时间】:2018-02-18 10:26:49
【问题描述】:

我正在尝试从我的 Dynamics CRM 在线发出 HttpRequest 以在外部 ERP 系统上创建记录。我使用 HttpClient 但我不确定我是否正确执行,我没有得到任何响应。代码如下:

 public async void Execute(){
        string query1 = $"<RequestData>" +
        $"<firstField>{model.firstField}</firstField>" +
        $"<secondField>{model.secondField}</secondField>" +
        $"<thirdField>{model.thirdField}</thirdField>" +
            $"</RequestData>";
       HttpClient client = CreateClient();
       HttpResponseMessage response = await SendRequest(client, HttpMethod.Put, query);
}

  private HttpClient CreateClient()
    {
        using (HttpClient client = new HttpClient())
        {
            client.BaseAddress = baseAdress;
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            return client;
        }
    }

     private async Task<HttpResponseMessage> SendRequest(HttpClient httpClient, HttpMethod method, string query)
    {
        HttpRequestMessage request = new HttpRequestMessage(method, query);
        return await httpClient.SendAsync(request);
    }

【问题讨论】:

  • 尝试从CreateClient中删除using并将using移动到Execute
  • 此外,您可能don't need to use using with (i.e., dispose) HttpClient。特别是如果您将多次使用它,请将其声明为类级变量,将其初始化一次(在您的 CreateClient 方法中没有using),然后就可以了.

标签: c# .net rest httpclient


【解决方案1】:

只要 HttpClient 离开 CreateClient 方法中的 using 语句,它就会被释放。 去掉 CreateClient 方法中的 using 语句,改为在 Execute 方法中实现 using

public async void Execute()
{
string query = $"<RequestData>" +
$"<firstField>{model.firstField}</firstField>" +
$"<secondField>{model.secondField}</secondField>" +
$"<thirdField>{model.thirdField}</thirdField>" +
    $"</RequestData>";
   using(HttpClient client = CreateClient())
   {
    HttpResponseMessage response = await SendRequest(client, HttpMethod.Put, query);
   }
}

private HttpClient CreateClient()
{
var client = new HttpClient();
   client.BaseAddress = baseAdress;
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
return client;
}

private async Task<HttpResponseMessage> SendRequest(HttpClient httpClient, HttpMethod method, string query)
{
HttpRequestMessage request = new HttpRequestMessage(method, query);
return await httpClient.SendAsync(request);
}

【讨论】:

  • 查询是否应该包含整个 url?还是开始在“BaseAddress”中,而查询是 url 的其余部分?
  • @Jarmoosh 如果您在 HttpClient 上设置 BaseAddress,那么您只需要在基地址之上提供路由,例如 'api/user'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多