HttpWebRequest Vs HttpClient

I have a piece of code that works using HttpWebRequest and HttpWebResponse , but I would like to convert it to use HttpClient and HttpResponseMessage .

This is a piece of code that works ...

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(serviceReq); request.Method = "POST"; request.ContentType = "text/xml"; string xml = @"<?xml version=""1.0""?><root><login><user>flibble</user>" + @"<pwd></pwd></login></root>"; request.ContentLength = xml.Length; using (StreamWriter dataStream = new StreamWriter(request.GetRequestStream())) { dataStream.Write(xml); dataStream.Close(); } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

And this is the code that I would like to replace if I could make it work.

 /// <summary> /// Validate the user credentials held as member variables /// </summary> /// <returns>True if the user credentials are valid, else false</returns> public bool ValidateUser() { bool valid = false; try { // Create the XML to be passed as the request XElement root = BuildRequestXML("LOGON"); // Add the action to the service address Uri serviceReq = new Uri(m_ServiceAddress + "?obj=LOGON"); // Create the client for the request to be sent from using (HttpClient client = new HttpClient()) { // Initalise a response object HttpResponseMessage response = null; // Create a content object for the request HttpContent content = HttpContentExtensions. CreateDataContract<XElement>(root); // Make the request and retrieve the response response = client.Post(serviceReq, content); // Throw an exception if the response is not a 200 level response response.EnsureStatusIsSuccessful(); // Retrieve the content of the response for processing response.Content.LoadIntoBuffer(); // TODO: parse the response string for the required data XElement retElement = response.Content.ReadAsXElement(); } } catch (Exception ex) { Log.WriteLine(Category.Serious, "Unable to validate the Credentials", ex); valid = false; m_uid = string.Empty; } return valid; } 

I think the problem is creating the content object and the XML is not bound correctly (maybe).

+6
source share
2 answers

I would really like to know the reason why one approach does not work and the other - but I just do not have time for some further digging. {: ABOUT (

Anyway, this is what I found.

A failure occurs when the contents of a request are created using the following

 HttpContent content = HttpContentExtensions.Create(root, Encoding.UTF8, "text/xml"); 

But it works correctly when you create such content ...

 HttpContent content = HttpContent.Create(root.ToString(), Encoding.UTF8, "text/xml"); 

The last working function is this:

 /// <summary> /// Validate the user credentials held as member variables /// </summary> /// <returns>True if the user credentials are valid, else false</returns> public bool ValidateUser() { bool valid = false; try { // Create the XML to be passed as the request XElement root = BuildRequestXML("LOGON"); // Add the action to the service address Uri serviceReq = new Uri(m_ServiceAddress + "?obj=LOGON"); // Create the client for the request to be sent from using (HttpClient client = new HttpClient()) { // Initalise a response object HttpResponseMessage response = null; #if DEBUG // Force the request to use fiddler client.TransportSettings.Proxy = new WebProxy("127.0.0.1", 8888); #endif // Create a content object for the request HttpContent content = HttpContent.Create(root.ToString(), Encoding.UTF8, "text/xml"); // Make the request and retrieve the response response = client.Post(serviceReq, content); // Throw an exception if the response is not a 200 level response response.EnsureStatusIsSuccessful(); // Retrieve the content of the response for processing response.Content.LoadIntoBuffer(); // TODO: parse the response string for the required data XElement retElement = response.Content.ReadAsXElement(); } } catch (Exception ex) { Log.WriteLine(Category.Serious, "Unable to validate the user credentials", ex); valid = false; m_uid = string.Empty; } return valid; } 

Thanks.

+1
source

The HttpClient.Post method has an overload that accepts the contentType parameter, try the following:

 // Make the request and retrieve the response response = client.Post(serviceReq, "text/xml", content); 
+1
source

Source: https://habr.com/ru/post/887737/


All Articles