XML を Web サイトに送信するプログラムを作成しています。書かれたコードは正常に動作しますが、何らかの理由で動作を停止し、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()失敗してエラーが発生したときです
ContentLength>0 または SendChunked==true を設定する場合は、要求本文を指定する必要があります。これを行うには、[Begin]GetResponse の前に [Begin]GetRequestStream を呼び出します。
どんな助けでも大歓迎です。