2014-01-06 2 views
3

Я работаю с OAuth на данный момент. Проблема с текущим кодом заключается в том, что он не дожидается, пока пользователь разрешит приложение на сайте и получит правильный ключ и секрет. Я использовал многопоточность, но иногда это не так много ... некоторые пользователи медленнее, чем другие. Я добавил фрагмент кода. То, что я хотел бы знать, - это где вставить какое-либо заявление, или я должен его использовать?Получить приложение, чтобы ждать обновления переменных

public OAuthToken GetRequestToken(Uri baseUri, string consumerKey, string consumerSecret) 
{ 
    var uri = new Uri(baseUri, "oauth/request_token"); 
    uri = SignRequest(uri, consumerKey, consumerSecret); 
    var request = (HttpWebRequest) WebRequest.Create(uri); 
    request.Method = WebRequestMethods.Http.Get; 
    var response = request.GetResponse(); 
    var queryString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 
    var parts = queryString.Split('&'); 
    var token = parts[1].Substring(parts[1].IndexOf('=') + 1); 
    var secret = parts[0].Substring(parts[0].IndexOf('=') + 1); 
    return new OAuthToken(token, secret); 
} 
+1

Какую библиотеку OAuth вы используете? – klugerama

+0

Не могли бы вы указать, почему вам нужно подождать? Что это за приложение? Веб, рабочий стол? Существует много разных подходов, которые вы можете использовать в зависимости от типа приложения. – Leo

+0

@klugerama Насколько я могу судить, я считаю, что это Dropbox REST API – Jim

ответ

3

Вы должны переключиться на более новую System.Net.Http и System.Net.Http.WebRequest библиотек, которые поставляются вместе с .NET в настоящее время. Все они используют новый материал для асинхронного программирования, доступный с .NET 4.5.

Вы можете вызвать запрос (возвращая объект задачи, который вы можете ожидать), и автоматически приостанавливать поток для ответа. Пользовательский интерфейс не будет отвечать, как обычно. Это, наверное, самая простая задача, если вы не понимаете, как работают новые ключевые слова async и ожидания. Для получения дополнительной информации о них см http://msdn.microsoft.com/en-us/library/hh191443.aspx

Вот ваш код делает вещи с новыми библиотеками:

using System.Net.Http; 

public OAuthToken GetRequestToken(Uri baseUri, string consumerKey, string consumerSecret) 
{ 
    var uri = new Uri(baseUri, "oauth/request_token"); 
    uri = SignRequest(uri, consumerKey, consumerSecret); 

    var message = new HttpRequestMessage(new HttpMethod("GET"), uri); 
    var handler = new WebRequestHandler(); 
    var client = new HttpClient(handler); 

    // Use the http client to send the request to the server. 
    Task<HttpResponseMessage> responseTask = client.SendAsync(message); 

    // The responseTask object is like a wrapper for the other task thread. 
    // We can tell this task object that we want to pause our current thread 
    // and wait for the client.SendAsync call to finish. 
    responseTask.Wait(); 

    // - Once that thread finishes, and the code continues on, we need to 
    // tell it to read out the response data from the backing objects. 
    // - The responseTask.Result property represents the object the async task 
    // was wrapping, we want to pull it out, then use it and get the content 
    // (body of the response) back. 
    // - Getting the response actually creates another async task (the 
    // .ReadAsStringAsync() call) but by accessing the .Result 
    // property, it is as if we called .ReadAsStringAsync().Wait(); Except that 
    // by using Result directly, we not only call Wait() but we get the resulting, 
    // wrapped object back. Hope that didn't confuse you much :) 
    var queryString = responseTask.Result.Content.ReadAsStringAsync().Result; 

    // And all your other normal code continues. 
    var parts = queryString.Split('&'); 
    var token = parts[1].Substring(parts[1].IndexOf('=') + 1); 
    var secret = parts[0].Substring(parts[0].IndexOf('=') + 1); 
    return new OAuthToken(token, secret); 
} 
0

Почему бы не использовать модальное всплывающее, а затем вызвать класс аутентификации на кнопку отправки

Смежные вопросы