0

次のクラスがあります(ネット上の例から取得しました。変更したのは、ドメイン名の代わりにIPアドレスとポートを使用することだけです):

public class ConnectionManager
{
    private static ManualResetEvent allDone = new ManualResetEvent(false);
    private string message = "foobar";

    public Action MessageSent;
    public Action<string> MessageReceived;
    public void SendMessage()
    {
          // Create a new HttpWebRequest object.
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://10.1.91.48:3330/");

        request.ContentType = "application/json; charset=utf-8";
        request.Accept = "application/json";
        // Set the Method property to 'POST' to post data to the URI.
        request.Method = "POST";

        // start the asynchronous operation
        request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);
        MessageSent();
        // 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();
    }
    private void GetRequestStreamCallback(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(message);

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

        // Start the asynchronous operation to get the response
        request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
    }

    private void GetResponseCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

        // End the operation
        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
        Stream streamResponse = response.GetResponseStream();
        StreamReader streamRead = new StreamReader(streamResponse);
        string responseString = streamRead.ReadToEnd();
        Console.WriteLine(responseString);
        // Close the stream object
        streamResponse.Close();
        streamRead.Close();

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

        MessageReceived(responseString);
    }
}

上記のコードはメッセージの送信に失敗します。ステップすると、GetRequestStreamCallback 内にいるときに IAsyncResult 内に次のエラーが表示されます。

AsyncWaitHandle = 'asynchronousResult.AsyncWaitHandle' がタイプ 'System.NotSupportedException' の例外をスローしました

私は何を間違っていますか?このコードを修正するにはどうすればよいですか?

4

3 に答える 3

1

代わりに、RestSharp を使用することもできます。

http://restsharp.org/

これは、この種のことをより簡単にします。ただし、Windows Phone で動作させるには、若干の変更を加える必要があります。

http://www.tonicodes.net/blog/async-and-restsharp-for-windows-phone-7/

あまりにもクレイジーなことはありません。

于 2012-11-18T03:14:01.317 に答える
1

おそらく問題の解決策にはなりませんが、オブジェクトを using ブロックに配置する習慣を身につけてIDisposable、例外が発生した場合でもオブジェクトが確実にクリーンアップされるようにする必要があります。

private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

    // End the operation
    using (Stream postStream = request.EndGetRequestStream(asynchronousResult))
    {
        byte[] byteArray = Encoding.UTF8.GetBytes(message);

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

    // Start the asynchronous operation to get the response
    request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
}

private void GetResponseCallback(IAsyncResult asynchronousResult)
{
    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

    // End the operation
    string responseString;
    using (HttpWebResponse response = (HttpWebResponse) request.EndGetResponse(asynchronousResult))
    {
        using (Stream streamResponse = response.GetResponseStream())
        {
            using (StreamReader streamRead = new StreamReader(streamResponse))
            {
                responseString = streamRead.ReadToEnd();
                Console.WriteLine(responseString);
            }
        }
    }
    allDone.Set();

    MessageReceived(responseString);
}
于 2012-11-18T02:03:36.413 に答える
1

私は WebClient を使用することになりました:

WebClient wc = new WebClient();
wc.DownloadStringCompleted += ReadServerResponse;
wc.DownloadStringAsync(new Uri(url));
于 2012-11-18T08:31:00.750 に答える