2013-04-17 2 views
0

Я следующий C класс #, который инициирует запрос HTTP с телефона Windows, на сервере:Fetching Результат от HTTP Response

public class Request 
{ 
    public string data; 
    public string result; 

    public Request() 
    { 

    } 

    public void doRequest(string parameters, string URL) 
    { 
     data = parameters; 

     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL); 
     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request); 
    } 

    public void GetRequestStreamCallback(IAsyncResult callbackResult) 
    { 
     HttpWebRequest myRequest = (HttpWebRequest)callbackResult.AsyncState; 
     Stream postStream = myRequest.EndGetRequestStream(callbackResult); 
     byte[] byteArray = Encoding.UTF8.GetBytes(data); 

     postStream.Write(byteArray, 0, byteArray.Length); 
     postStream.Close(); 

     myRequest.BeginGetResponse(new AsyncCallback(GetResponsetStreamCallback), myRequest); 
    } 

    public void GetResponsetStreamCallback(IAsyncResult callbackResult) 
    { 
     HttpWebRequest request = (HttpWebRequest)callbackResult.AsyncState; 
     HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(callbackResult); 

     StreamReader httpWebStreamReader = new StreamReader(response.GetResponseStream()); 
     result = httpWebStreamReader.ReadToEnd(); 
    } 

Теперь в моем главном классе, я вызываю метод doRequest, чтобы сделать HTTP запрос от телефона с Windows:

Request req = new Request(); 
req.doRequest("function=LogIn&username=" + username + "&password=" + password, "http://localhost:4000/Handler.ashx"); 

при вызове этого метода, как я могу получить результат (результата переменной) с сервера, так как она получена в методе GetResponsetStreamCallback и не в методе doRequest?

+0

У меня нет вашей проблемы ... Вы подписались на событие с использованием 'IAsynResult' и обрабатываете событие с помощью своего метода ... Получите результат в методе GetResponsetStreamCallback (IAsyncResult callbackResult)'. –

+0

@ bash.d Помните, что большой фрагмент кода - это собственный класс. Всякий раз, когда мне нужно использовать этот код, я создаю экземпляр класса и вызываю метод doRequest для создания httpRequest. Другие методы автоматически вызывается методом doRequest. Однако я не знаю, как получить результат этого класса в вызывающем классе. Btw, код в классе запроса не является моим. Я нашел его на msdn и немного изменил. –

+0

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

ответ

0

У вас есть несколько возможностей. Можно было бы определить property, чтобы сделать результат доступным снаружи. Определение

public class Request 
{ 
    public string Result 
    { 
     get{ 
      if(result != null && !string.IsNullOrEmpty(result)) 
       return result; 
      return null; 
     } 
    } 
    ... 
} 

Вы можете создать событие и есть объекты, подписаться на него, так что вы можете заметить их, когда асинхронный запрос закончился. Или сделайте свои звонки синхронными, что немного легче сделать, поскольку вы не синхронизируете свои звонки и запросы от других объектов.