2011-12-15 16 views
1

を消費:どのように私は以下のような非同期サービスを利用することができていたWebサービスの非同期

public void PostMethodResponse() 
{ 
    try 
    { 
     HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(_url); 
     myRequest.Method = "POST"; 
     myRequest.Headers["SOAPAction"] = _action; 
     myRequest.ContentType = "text/xml; charset=utf-8"; 
     myRequest.Accept = "text/xml"; 
     myRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), myRequest); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

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

     System.IO.Stream postStream = request.EndGetRequestStream(asynchronousResult); 
     byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(_postData);     
     postStream.Write(byteArray, 0, byteArray.Length); 
     postStream.Close(); 
     // Start the asynchronous operation to get the response 
     request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

private void GetResponseCallback(IAsyncResult asynchronousResult) 
{ 
    try 
    { 
     HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; 
     HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult); 
     Stream streamResponse = response.GetResponseStream(); 
     StreamReader streamRead = new StreamReader(streamResponse); 
     string responseString = streamRead.ReadToEnd(); 
     // Close the stream object 
     streamResponse.Close(); 
     streamRead.Close(); 
     // Release the HttpWebResponse 
     response.Close(); 
     _response = responseString;      

    } 
    catch (Exception ex) 
    { 
     _response = ex.Message; 

    } 
} 

私はViewModelにクラスから(モデルクラスである)PostMethodResponse()関数を呼び出しています。私はGetResponseCallback関数で応答を得ることができますが、どのようにViewModelに応答を返し、次にView(フロントエンド.xaml)に返すことができます。レスポンスを取得するには、イベントGetResponseCallback関数を起動し、ViewModelクラスをキャッチして、同じイベントViewModelを起動し、ビューをキャッチします。ただし、これは正しい方法ではありません。

MVVMアーキテクチャのWebサービスの呼び出しを理解してください。

ありがとうございます。

+1

このMVVMとは何の関係もありません。それはイベントの基本的な理解とC# –

+2

での非同期プログラミングについてです。誰かが "ex"をタイプするたびに、子猫が殺されるたびに。 –

+0

返信ありがとうございます。私はMVVMのアーキテクチャを理解するのがちょっと混乱しています.OK、その後、私の結果を.xaml.csページに返さなければならないこのクラスのPostMethodResponse()関数を呼び出すクラスに私の応答を返す方法を教えてください。 – Avinash

答えて

2
  1. viewmodelにコールバックをBeginGetRequestStreamオブジェクトの状態パラメータに追加します。
  2. GetResponseCallbackのasynchronousResultからコールバックを取得します。あなたのコールバックタイプにキャストして、あなたの返答を返してください。このよう

class HttpRequest<T> 
{ 
    internal HttpRequest(HttpWebRequest webRequest, Action<T> callback) 
    { 
     WebRequest = webRequest; 
     Callback = callback; 
    } 

    internal HttpWebRequest WebRequest { get; private set; } 
    internal Action<T> Callback { get; private set; } 
} 
class Class1 
{ 
    private Uri _url; 
    private string _action; 
    private string _postData; 

    public void PostMethodResponse(Action<string> callback) 
    { 
     try 
     { 
      HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(_url); 
      myRequest.Method = "POST"; 
      myRequest.Headers["SOAPAction"] = _action; 
      myRequest.ContentType = "text/xml; charset=utf-8"; 
      myRequest.Accept = "text/xml"; 
      myRequest.BeginGetRequestStream(GetRequestStreamCallback, new HttpRequest<string>(myRequest, callback)); 
     } 
     catch (Exception ex) 
     { 
      // log blah 
     } 
    } 

    private void GetRequestStreamCallback(IAsyncResult asynchronousResult) 
    { 
     try 
     { 
      HttpRequest<string> request = (HttpRequest<string>)asynchronousResult.AsyncState; 

      System.IO.Stream postStream = request.WebRequest.EndGetRequestStream(asynchronousResult); 
      byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(_postData); 
      postStream.Write(byteArray, 0, byteArray.Length); 
      postStream.Close(); 
      // Start the asynchronous operation to get the response 
      request.WebRequest.BeginGetResponse(GetResponseCallback, request); 
     } 
     catch (Exception ex) 
     { 
      // nothing to see, move along 
     } 
    } 

    private void GetResponseCallback(IAsyncResult asynchronousResult) 
    { 
     try 
     { 
      HttpRequest<string> request = (HttpRequest<string>)asynchronousResult.AsyncState; 
      HttpWebResponse response = (HttpWebResponse)request.WebRequest.EndGetResponse(asynchronousResult); 
      Stream streamResponse = response.GetResponseStream(); 
      if (streamResponse != null) 
      { 
       StreamReader streamRead = new StreamReader(streamResponse); 
       string responseString = streamRead.ReadToEnd(); 
       // Close the stream object 
       streamResponse.Close(); 
       streamRead.Close(); 
       // Release the HttpWebResponse 
       response.Close(); 
       request.Callback(responseString); 
      } 
     } 
     catch (Exception) 
     { 

     } 
    } 
} 
+0

返信ありがとうアーサー、しかし、私はイベントハンドラの新しいです。あなたは、私は、私はGetRequestStreamCallback(私のvoid GetRequestStreamCallback(IAsyncResult asynchronousResult)の構文を変更する必要があります)の行を変更したと言ったように。構文は何ですか? – Avinash

+0

GetRequestStreamCallbackの署名を変更する必要はありません。 HttpRequest は、IAsyncResultパラメータのオブジェクト状態にあります。 – dashton

+0

私は、上記のGetRequestStreamCallbackを追加して、意味がわかりません。正しくフォーマットできません。 – dashton

関連する問題