Как использовать веб-сервис асинхронно - PullRequest
1 голос
/ 15 декабря 2011

Я могу использовать службу асинхронно, как показано ниже:

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;

    }
}

Я вызываю функцию PostMethodResponse () (которая находится в классе модели) из класса ViewModel. Я могу получить ответ в функции GetResponseCallback, но как я могу вернуть этот ответ в ViewModel, а затем в View (Front End .xaml). Чтобы получить ответ, мы можем запустить функцию GetResponseCallback события, а затем перехватить его класс ViewModel и запустить то же событие ViewModel и перехватить его View, но это не правильный путь.

Пожалуйста, помогите мне понять веб-сервисы вызова архитектуры MVVM.

Заранее спасибо.

1 Ответ

2 голосов
/ 15 декабря 2011
  1. Добавьте обратный вызов для вашей модели представления в параметр состояния объекта BeginGetRequestStream.
  2. Получите обратный вызов из asynchronousResult в GetResponseCallback.Приведите его к типу обратного вызова и перезвоните с вашим ответом.

Как это:

    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 )
        {

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...