gpt4 book ai didi

c# Webrequest Post 和 GetResponse

转载 作者:行者123 更新时间:2023-11-30 14:32:38 26 4
gpt4 key购买 nike

我正在编写一个程序,用于向网站提交 XML。编写的代码工作正常,但是有时它会因为某种原因停止工作,抛出一个System.Net.ProtocolViolationException。我可以关闭程序并重新运行 - 它再次开始工作就好了。

这是我使用的代码:

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() 是失败报错的时候

You must provide a request body if you set ContentLength>0 or SendChunked==true. Do this by calling [Begin]GetRequestStream before [Begin]GetResponse.

如有任何帮助,我们将不胜感激。

最佳答案

这变得棘手,因为我们正在进行异步调用。

按以下顺序执行此操作:

request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request)

然后在'GetRequestStreamCallback(IAsyncResult asynchronousResult)'中调用:

request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request)

最后,在 GetResponse 中,确保关闭流:

response.Close();
allDone.Set();

MSDN 对其进行了很好的解释:http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetrequeststream.aspx

关于c# Webrequest Post 和 GetResponse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18126941/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com