c# - Webrequest Post und GetResponse
Schreibe ich ein Programm, mit dem Einreichen einer XML-website. Der code funktioniert einwandfrei, aber manchmal ist es einfach nicht mehr funktioniert aus irgendeinem Grund, das werfen einer
System.Net.ProtocolViolationException. Ich kann das Programm schließen und erneut starten - es startet wieder ganz gut.
Hier ist der code, den ich verwende:
private string Summit(string xml)
{
string result = string.Empty;
StringBuilder sb = new StringBuilder();
try {
WebRequest request = WebRequest.Create(this.targetUrl);
request.Timeout = 800 * 1000;
RequestState requestState = new RequestState(xml);
requestState.Request = request;
request.ContentType = "text/xml";
//Set the 'Method' property to 'POST' to post data to a Uri.
requestState.Request.Method = "POST";
requestState.Request.ContentType = "text/xml";
//Start the Asynchronous 'BeginGetRequestStream' method call.
IAsyncResult r = (IAsyncResult)request.BeginGetRequestStream(new AsyncCallback(ReadCallBack), requestState);
//Pause the current thread until the async operation completes.
//Console.WriteLine("main thread waiting...");
allDone.WaitOne();
//Assign the response object of 'WebRequest' to a 'WebResponse' variable.
WebResponse response = null;
try {
response =request.GetResponse();
} catch (System.Net.ProtocolViolationException ex) {
response = null;
request.Abort();
request = null;
requestState = null;
return "";
}
//Console.WriteLine("The string has been posted.");
//Console.WriteLine("Please wait for the response...");
Stream streamResponse = response.GetResponseStream();
StreamReader streamRead = new StreamReader(streamResponse);
Char[] readBuff = new Char[256];
int count = streamRead.Read(readBuff, 0, 256);
//StringBuilder sb = new StringBuilder();
while (count > 0) {
String outputData = new String(readBuff, 0, count);
sb.Append(outputData);
count = streamRead.Read(readBuff, 0, 256);
}
//Close the Stream Object.
streamResponse.Close();
streamRead.Close();
//allDone.WaitOne();
//Release the HttpWebResponse Resource.
response.Close();
//return sb.ToString();
} catch (WebException webex) {
Debug.WriteLine(webex.Message);
} catch (System.Web.Services.Protocols.SoapException soapex) {
Debug.WriteLine(soapex.Message);
} catch (System.Net.ProtocolViolationException ex) {
Debug.WriteLine(ex.Message);
} catch (Exception ex) {
Debug.WriteLine(ex.Message);
}
return sb.ToString();
}
private static void ReadCallBack(IAsyncResult asyncResult)
{
try {
RequestState myRequestState = (RequestState)asyncResult.AsyncState;
WebRequest myWebRequest2 = myRequestState.Request;
//End of the Asynchronus request.
Stream responseStream = myWebRequest2.EndGetRequestStream(asyncResult);
//Convert the string into a byte array.
ASCIIEncoding encoder = new ASCIIEncoding();
byte[] ByteArray = encoder.GetBytes(myRequestState.Xml);
//Write data to the stream.
responseStream.Write(ByteArray, 0, myRequestState.Xml.Length);
responseStream.Close();
} catch (WebException e) {
Console.WriteLine("\nReadCallBack Exception raised!");
Console.WriteLine("\nMessage:{0}", e.Message);
Console.WriteLine("\nStatus:{0}", e.Status);
}
allDone.Set();
}
response =request.GetResponse()
ist, wenn es schlägt fehl und gibt einen Fehler
Müssen Sie einen Antrag body wenn Sie ContentLength>0 bzw.
SendChunked==true. Tun Sie dies durch aufrufen von [Begin]GetRequestStream vor
[Begin]GetResponse.
Jegliche Hilfe würde sehr geschätzt werden.
Ich denke, man sollte den Antrag mit einem contentLength : msdn.microsoft.com/en-us/library/... msdn.microsoft.com/en-us/library/...
Hi, ich habe versucht, das auch .. aber kein Glück .. Danke
Hi, ich habe versucht, das auch .. aber kein Glück .. Danke
InformationsquelleAutor user2664502 | 2013-08-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies schwierig wird, da wir sind dabei asynchrone Aufrufe.
Tun dies in der folgenden Reihenfolge:
Dann in 'GetRequestStreamCallback(IAsyncResult asynchronousResult)' call:
Zuletzt in den GetResponse, sicher sein, um den stream schließen:
MSDN Macht einen wirklich guten job, die erklären es: http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetrequeststream.aspx
Hi Irsal.. Jetzt scheint dies zu funktionieren viel besser .. Und nicht Umfallen, so Häufig wie es früher war.. Aber ich werde es testen, mehr gründlich... vielen Dank für die Hilfe..
Super!!! Lassen Sie mich wissen, wenn Sie etwas seltsam bei den Prüfungen.
InformationsquelleAutor Irsal