[英]HttpClient POST Protobuf ByteArray to ASP.NET Core Web API
[英]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.