Вернуть ответ из HTTPWebRequest как-нибудь? - PullRequest
0 голосов
/ 20 января 2012

Я пытаюсь проверить пользователя в моем приложении WP7, проверяя имя пользователя / пароль на сервере.

В моем методе «validate user» я создаю HTTPWebRequest с материалами, которые мне нужно проверить.

Тогда, насколько я вижу, единственная возможность выполнить - использовать request.BeginGetResponse с асинхронным обратным вызовом.

Но я хочу вернуть ответ на запрос тем же способом, в котором я создал запрос, как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 20 января 2012

Я не уверен, почему вы хотите вернуть его в вызывающий метод.Я бы просто использовал стандартное поведение WebClient , как показано ниже:

public void ValidateUser()
{
    WebClient webClient = new WebClient();

    Uri uri = new Uri(url);
    webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
    webClient.DownloadStringAsync(new Uri(url));
}

void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    //Validate result from response by using e.Result
}
0 голосов
/ 20 января 2012

Единственный реальный способ достичь того, что вам нужно, - это создать событие в вашем рабочем классе и запустить это событие, когда асинхронный вызов завершится, поэтому (псевдокод) ...

void StartDownload(object[] parameters)
{
    var req = HttpWebRequest.Create("http://google.com");
    req.BeginGetRequestStream(Completed_handler, req);
}

void Completed_handler(object sender, DownloadStringCompletedEventArgs e)
{
    var request = (HttpWebRequest)result.AsyncState;
    var response = request.EndGetResponse(result);

    using (var stream = response.GetResponseStream())
    using (var reader = new StreamReader(stream))
    {
        var contents = reader.ReadToEnd();
        NotifyCallerOfContent(contents)
    }
}

public event EventHandler<MyCustomEventArgsClass> DownloadHasFinished;

public NotifyCallerOfDownload(string content)
{
    if(null != DownloadHasFinished)
    {
        DownloadHasFinished(this, new MyCustomEventArgsClass(content));
    }
}

и затем подпишитесь на событие DownloadHasFinished в вашем классе вызова.

Что касается специфического вызова HttpWebRequest, взгляните на этот вопрос , где вы найдете несколько рабочих примеров.

0 голосов
/ 20 января 2012

BeginGetResponse возвращает IAsyncResult с дескриптором ожидания, который сигнализируется при завершении запроса.Все, что вам нужно сделать, это подождать с этим дескриптором: [не работает на WP7]


ОБНОВЛЕНИЕ: используйте ManualResetEvent

var mre = new ManualResetEvent( false );

var iar = myHttpWebRequest.BeginGetResponse( state => mre.Set(), null );

mre.WaitOne();

var response = myHttpWebRequest.EndGetResponse( iar );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...