简体   繁体   中英

C# HTTPClient PostAsync does not send data

I have the following code to send an HTTP request, but it does not transmit any packets (checked using 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);

However, it transmits packet when I add:

respone.Wait(100);

Can you please help on how do get httpClient.PutAsync to work without the wait?

Thanks!

As they already told you, you are using an asynchronous call so you have to wait until that action is solved to end your method/program.

Also, it's a good practice to use using statements for your httpClient and your content, so you free the memory once the code is executed. And maybe you'll want to react to the HTTP response. Try something like this:

            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 is an async method that returns System.Threading.Tasks.Task<TResult> that is awaitable and should be awaited to call it asynchronous and get the result of it this code is the best way to call the method asynchronously and return its value NOTE: you better call it in Async method:

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

if you insist on calling it synchronously, you can get the Result of Task ,

which will cause your thread to block until the Result is available as @Heinzi answered this problem :

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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