簡體   English   中英

Asp.net核心,HttpClient通過POST請求到達SOAP服務

[英]Asp.net core, HttpClient to reach SOAP service with POST request

我正在嘗試使用HttpClient到達第三方SOAP WS。

[HttpGet]
public IActionResult Login()
{
  HttpClientHandler httpClientHandler = new HttpClientHandler();
  httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; };
  HttpClient client = new HttpClient(httpClientHandler);
  HttpRequestMessage request = new HttpRequestMessage(new HttpMethod("POST"), myUrl);
  request.Content = new StringContent(myXmlString, Encoding.UTF8, "text/xml");
  request.Headers.Add("SOAPAction",https://actionNameOfWs);
  HttpResponseMessage response = client.SendAsync(request).Result;
  if(response.StatusCode == HttpStatusCode.OK) return new OkResult();
  else return new ObjectResult(response.StatusCode);
}

在這一點上,一切都因TaskCanceledException: A task was canceled中斷TaskCanceledException: A task was canceled ,這實際上不是任務取消,而是連接超時。 我可以通過SOAP UI通過https發送相同的POST請求,因此與WS的連接不是問題。 我可以通過上面的代碼通過http發送POST請求。 但是一旦我嘗試了上面的代碼以通過https發送POST,我就會得到連接超時。 那么,哪里有收獲?

我的環境是:操作系統:Linux Mint 16.04 .Net核心:1.0.1

您可能正在混合異步和阻止呼叫。 .Result是一個阻塞調用,當與異步調用混合使用時,可能導致死鎖,並可能導致超時。 始終使調用操作保持異步。

[HttpGet]
public async Task<IActionResult> Login() {
    var httpClientHandler = new HttpClientHandler();
    httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; };
    var client = new HttpClient(httpClientHandler);
    client.Timeout = TimeSpan.FromSeconds(90);
    var request = new HttpRequestMessage(HttpMethod.Post, myUrl);
    request.Content = new StringContent(myXmlString, Encoding.UTF8, "text/xml");
    request.Headers.Add("SOAPAction", https://actionNameOfWs);
    var response = await client.SendAsync(request);
    if(response.StatusCode == HttpStatusCode.OK) return Ok();
    else return StatusCode((int)response.StatusCode);
}

我還建議您檢查發送的原始請求及其響應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM