繁体   English   中英

C# HTTPClient PostAsync 不发送数据

[英]C# HTTPClient PostAsync does not send data

我有以下代码来发送 HTTP 请求,但它不传输任何数据包(使用 Wireshark 检查)。

        var httpClient = new HttpClient();
        string uri = "http://" + IP + ":" + port + "/";

        var stringContent = new StringContent(xmlString, Encoding.UTF8, "application/xml");
        var respone = httpClient.PutAsync(uri, stringContent);

但是,当我添加时它会传输数据包:

respone.Wait(100);

您能否帮助了解如何让 httpClient.PutAsync 无需等待即可工作?

谢谢!

正如他们已经告诉您的那样,您正在使用异步调用,因此您必须等到该操作解决才能结束您的方法/程序。

此外,对 httpClient 和内容使用 using 语句是一种很好的做法,因此一旦执行代码就可以释放内存。 也许你会想要对 HTTP 响应做出反应。 尝试这样的事情:

            using (HttpClient httpClient= new HttpClient())
            {
                using (StringContent content = new StringContent(xmlString))
                {
                    content.Headers.ContentType = new MediaTypeHeaderValue("application/xml");
                    HttpResponseMessage message = await httpClient.PutAsync(new Uri("http://" + IP + ":" + port + "/"), content).ConfigureAwait(false);
                    if (!message.IsSuccessStatusCode)
                    {
                         //For example log a failure
                        _logger.LogError($"HTTP unsuccess status code: {await message.Content.ReadAsStringAsync().ConfigureAwait(false)}");
                    }
                }
            }

PutAsync是一个异步方法,它返回System.Threading.Tasks.Task<TResult>是可等待的,应该等待异步调用它并获取它的结果 此代码是异步调用该方法并返回其值的最佳方式注意: 你最好在Async方法中调用它:

var respone = await httpClient.PutAsync(uri, stringContent);

如果你坚持同步调用它,你可以得到TaskResult

这将导致您的线程阻塞,直到Result可用,因为@Heinzi 回答了这个问题

var respone = httpClient.PutAsync(uri, stringContent).Result;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM