2013-07-08 15 views
24

Potrzebuję HTTP wysłać dane XML do adresu URL, który ma Textarea z nazwą XMLdata. Moje dane XMl są gotowe i znajdują się w XDocument Sendingxml = xml; ale kod pocztowy, który próbowałem, nie działa. Głównie dlatego, że nie wiem jak umieścić dane XML w zmiennej postData, ponieważ akceptuje ona tylko ciąg znaków. To jest mój kod:HTTP post danych XML w C#

 XDocument Sendingxml = xml; 

     // string Sendingxml = "<?xml version=1.0 encoding=UTF-8> <PluginData> <Credential UserName=avosfieldagent01 AuthenticationToken=61cc3957744742dca238c4dd7cbca702 /><Session><PropertyAddress>5 Crosskey</PropertyAddress><PropertyAddress2/><PropertyCity>California</PropertyCity><PropertyState>CA</PropertyState><PropertyZip>92620</PropertyZip><PropertyType>Condo</PropertyType><SourceReferenceId>45643</SourceReferenceId><SessionId>2013070100158346</SessionId><SessionCompleteReturnURL/><CustomerId/><BluebookOrderCheckSum>681a598cf23f412095f6092c281823e6</BluebookOrderCheckSum><BluebookOrderId>11160</BluebookOrderId> </Session></PluginData>"; 

     // Create a request using a URL that can receive a post. 
     WebRequest request = 
      WebRequest.Create("https://test.bluebookcva.net/order/testdirectplugin/3"); 
     // Set the Method property of the request to POST. 
     request.Method = "POST"; 

     // Create POST data and convert it to a byte array. 
     string postData = "XMLData=" + Sendingxml; //My problem is here as I need postData as XDocument. 


     byte[] byteArray = Encoding.UTF8.GetBytes(postData); 
     // Set the ContentType property of the WebRequest. 
     request.ContentType = "application/x-www-form-urlencoded"; 
     // Set the ContentLength property of the WebRequest. 
     request.ContentLength = byteArray.Length; 
     // Get the request stream. 
     Stream dataStream = request.GetRequestStream(); 
     // Write the data to the request stream. 
     dataStream.Write(byteArray, 0, byteArray.Length); 
     // Close the Stream object. 
     dataStream.Close(); 
     // Get the response. 
     WebResponse response = request.GetResponse(); 
     // Display the status. 
     Console.WriteLine(((HttpWebResponse)response).StatusDescription); 
     // Get the stream containing content returned by the server. 
     dataStream = response.GetResponseStream(); 
     // Open the stream using a StreamReader for easy access. 
     StreamReader reader = new StreamReader(dataStream); 
     // Read the content. 
     string responseFromServer = reader.ReadToEnd(); 
     // Display the content. 
     Console.WriteLine(responseFromServer); 
     // Clean up the streams. 
     reader.Close(); 
     dataStream.Close(); 
     response.Close(); 

Odpowiedz

67

ogólnie:

Przykładem łatwy sposób publikowania danych XML i uzyskać odpowiedź (jako ciąg) byłaby następująca funkcja:

public string postXMLData(string destinationUrl, string requestXml) 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(destinationUrl); 
    byte[] bytes; 
    bytes = System.Text.Encoding.ASCII.GetBytes(requestXml); 
    request.ContentType = "text/xml; encoding='utf-8'"; 
    request.ContentLength = bytes.Length; 
    request.Method = "POST"; 
    Stream requestStream = request.GetRequestStream(); 
    requestStream.Write(bytes, 0, bytes.Length); 
    requestStream.Close(); 
    HttpWebResponse response; 
    response = (HttpWebResponse)request.GetResponse(); 
    if (response.StatusCode == HttpStatusCode.OK) 
    { 
     Stream responseStream = response.GetResponseStream(); 
     string responseStr = new StreamReader(responseStream).ReadToEnd(); 
     return responseStr; 
    } 
    return null; 
} 

W konkretnej sytuacji:

Zamiast:

request.ContentType = "application/x-www-form-urlencoded"; 

zastosowanie:

request.ContentType = "text/xml; encoding='utf-8'"; 

także usunąć:

string postData = "XMLData=" + Sendingxml; 

I wymienić:

byte[] byteArray = Encoding.UTF8.GetBytes(postData); 

z:

byte[] byteArray = Encoding.UTF8.GetBytes(Sendingxml.ToString()); 
+0

Dzięki, ale co z tego 2 linie, ciąg postData = „XMLData =” + Sendingxml; bajt [] byteArray = Encoding.UTF8.GetBytes (postData); Należę do postData jako XDocument, ponieważ muszę wysłać XMLData jako format XML, a nie ciąg. – Alma

+0

Przepraszam za to. Zaktualizowałem swoją odpowiedź bardziej kompletnym rozwiązaniem. – AlliterativeAlice

+0

Dzięki, zastąpiłem wszystko, co tu powiedziałeś, ale nadal nie przekierowuje nawet do adresu URL. – Alma

2

Przykład AlliterativeAlice bardzo mi pomógł. Jednak w moim przypadku serwer, z którym rozmawiałem, nie lubił pojedynczych cudzysłowów związanych z typem treści. Nie udało się z ogólnej "Server Error" i zajęło godzin, aby dowiedzieć się, co to nie podoba:

request.ContentType = "text/xml; encoding=utf-8"; 
+0

Dziękujemy! Miałem ten sam problem. Usunięto kleszcze i wszystko dobrze. – Keith