2

以下のコードでは、次のエラーが発生しています。

System.Net.ProtocolViolationException: ContentLength>0 または SendChunked==true を設定した場合は、要求本文を提供する必要があります。これを行うには、[Begin]GetResponse の前に [Begin]GetRequestStream を呼び出します。

このエラーがスローされる理由がわかりません。コメントや提案があれば役に立ちます

                 HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://");

                 // Set the ContentType property. 
                 request.ContentType = "application/x-www-form-urlencoded";
                 // Set the Method property to 'POST' to post data to the URI.
                 request.Method = "POST";
                 request.KeepAlive = true;
                 byte[] byteArray = Encoding.UTF8.GetBytes(postData);
                 request.ContentLength = byteArray.Length;
                 // Start the asynchronous operation.    
                 request.BeginGetRequestStream(new AsyncCallback(ReadCallback), request);

                 // Keep the main thread from continuing while the asynchronous
                 // operation completes. A real world application
                 // could do something useful such as updating its user interface. 
                 allDone.WaitOne();

                 // Get the response.
                 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                 Stream streamResponse = response.GetResponseStream();
                 StreamReader streamRead = new StreamReader(streamResponse);
                 string responseString = streamRead.ReadToEnd();
                 Console.WriteLine(responseString);
                 Console.ReadLine();
                 // Close the stream object.
                 streamResponse.Close();
                 streamRead.Close();

                 // Release the HttpWebResponse.
                 response.Close();





    private static void ReadCallback(IAsyncResult asynchronousResult)
    {

        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

        // End the operation.
        Stream postStream = request.EndGetRequestStream(asynchronousResult);



        // Convert the string into a byte array.
        byte[] byteArray = Encoding.UTF8.GetBytes(postData);

        // Write to the request stream.
        postStream.Write(byteArray, 0, postData.Length);
        postStream.Close();
        allDone.Set();
    }

HttpClient を使用するようにコードを変更しましたが、機能しません。

    public static async void PostAsync(String postData)
    {

        try
        {
            // Create a New HttpClient object.
            HttpClient client = new HttpClient();

            HttpResponseMessage response = await client.PostAsync("http://", new StringContent(postData));
            Console.WriteLine(response);
            //response.EnsureSuccessStatusCode();
            string responseBody = await response.Content.ReadAsStringAsync();
            // Above three lines can be replaced with new helper method in following line 
            // string body = await client.GetStringAsync(uri);

            Console.WriteLine(responseBody);

        }
        catch (HttpRequestException e)
        {
            Console.WriteLine("\nException Caught!");
            Console.WriteLine("Message :{0} ", e.Message);

        }
    }
4

2 に答える 2

1

ほとんどの場合、エラーは非同期操作と同期操作が混在していることが原因です。HttpWebRequest.BeginGetRequestStreamのドキュメントには次のように書かれています。

アプリケーションでは、特定のリクエストに対して同期メソッドと非同期メソッドを混在させることはできません。BeginGetRequestStream メソッドを呼び出す場合は、BeginGetResponse メソッドを使用して応答を取得する必要があります。

あなたのコードは を呼び出しますBeginGetRequestStreamが、それは を呼び出しますGetResponse

私が考えているのはBeginGetRequestStream、リクエストストリームへの非同期書き込みを開始する を呼び出すことですが、メインスレッドではGetResponse同時に呼び出します。そのため、リクエストがフォーマットされる前にリクエストを作成しようとしています。

リンクされた MSDN トピックの例を調べて、それに応じてコードを変更してください。

于 2013-08-12T21:50:58.050 に答える
0

プロキシを挿入する可能性を検討できますか?

<system.net>
    <defaultProxy enabled="true" useDefaultCredentials="true">
      <proxy proxyaddress="http://[proxyaddress]"  bypassonlocal="True"  usesystemdefault="True" />
    </defaultProxy>
</system.net>

これは私のコードで機能し、同じ問題を解決しました。ネットをチェックしてください。

于 2016-06-11T17:43:33.237 に答える