C#Webrequest发布和GetResponse [英] c# Webrequest Post and GetResponse

查看:99
本文介绍了C#Webrequest发布和GetResponse的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个程序,它将XML提交给网站.编写的代码可以正常工作,但是有时,由于某种原因,它只是停止工作,会抛出一个错误.System.Net.ProtocolViolationException.我可以关闭程序并重新运行-它再次可以正常运行.

I am writing a program that will submit a XML to a website. The code written works fine, but sometimes it just stops working for some reason, throwing a System.Net.ProtocolViolationException. I can close the program and re-run - it starts working again just fine.

这是我正在使用的代码:

Here is the code that I am using:

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()是失败并且给出错误

如果将ContentLength> 0或设置为ContentBength,则必须提供请求正文SendChunked == true.为此,请先调用[Begin] GetRequestStream[开始] GetResponse.

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

任何帮助将不胜感激.

推荐答案

由于我们正在进行异步调用,因此这很棘手.

This gets tricky since we're doing async calls.

按以下顺序执行此操作:

Do this in the following order:

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

然后在"GetRequestStreamCallback(IAsyncResult异步Result)"调用中:

Then in 'GetRequestStreamCallback(IAsyncResult asynchronousResult)' call:

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

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

Lastly, in the GetResponse, be sure to close the stream:

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

MSDN很好地解释了它: http://msdn.microsoft.com/zh-CN/library/system.net.httpwebrequest.begingetrequeststream.aspx

MSDN Does a really good job explaining it: http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetrequeststream.aspx

这篇关于C#Webrequest发布和GetResponse的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆