Работа с гамаком и приложением AgFx для Windows phone 7 - PullRequest
0 голосов
/ 22 августа 2011

Извините, если вопрос, который я задаю, создает бессмыслицу, поскольку я действительно новичок в этом. (

У меня есть проект, который уже использует Hammock для проверки подлинности oAuth (версия 1.0). А потом я увидел потрясающую инфраструктуру кэширования данных Шона Бёрка AgFx , и я действительно хочу использовать ее в своем проекте.

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

var request = new RestRequest
{
    Credentials = _credentials,
    Path = "/fav.xml",
    Method = WebMethod.Post
};

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

Но, насколько я понимаю, в AgFx мне нужно использовать WebLoadRequest для запроса данных, которые выглядят следующим образом

return new WebLoadRequest(loadContext, new Uri(myUri), "POST", "post-data");

где "post-data" должна быть строкой подписи oauth. Тогда в основном мне нужно выбросить то, что дает мне Гамак, и переписать код, чтобы получить подпись.

Мне просто интересно, есть ли лучший способ сделать это? Или я должен сказать, есть ли библиотека, которую я могу использовать, чтобы легко получить эту подпись?

Любая помощь будет высоко ценится!

Приветствия

Xin

1 Ответ

3 голосов
/ 24 августа 2011

Я понял это.

Шон Берк, который создал эту структуру, указал мне правильное направление.

В основном я создал HammockLoadRequest, который наследуется от LoadRequest AgFx, и в переопределении Execute замените HttpWebRequest на RestRequest Hammock, и все.

    public class HammockLoadRequest : LoadRequest
{
    public OAuthCredentials Credentials { get; set; }
    public string AuthorityUrl { get; set; }

    /// <summary>
    /// Create a HammockLoadRequest
    /// </summary>
    public HammockLoadRequest(LoadContext loadContext, OAuthCredentials credentials, string authorityUrl)
        : base(loadContext)
    {
        Credentials = credentials;
        AuthorityUrl = authorityUrl;
    }

    /// <summary>
    /// Performs the actual get for this request.
    /// </summary>
    /// <param name="result"></param>
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
    public override void Execute(Action<LoadRequestResult> result)
    {
        PriorityQueue.AddNetworkWorkItem(
            () =>
            {
                var client = new RestClient
                {
                    Authority = this.AuthorityUrl,
                    HasElevatedPermissions = true
                };

                var restRequest = new RestRequest
                {
                    Credentials = this.Credentials,
                    Path = "/xxx.json",
                };

                restRequest.AddParameter("count", "5");
                restRequest.AddParameter("include_rts", "1");
                //if (sinceId != 0)
                //    request.AddParameter("since_id", sinceId.ToString());

                RestCallback responseHandler = (request, response, userstate) =>
                {
                    if (response.StatusCode != HttpStatusCode.OK)
                    {
                        Helpers.ShowMessage(String.Format("Error Getting Status: {0}", response.StatusCode));
                        return;
                    }

                    // convert string to stream
                    byte[] bytes = Encoding.UTF8.GetBytes(response.Content);
                    var stream = new MemoryStream(bytes);
                    stream.Close();
                    result(new LoadRequestResult(new MemoryStream(bytes)));
                    return;
                };

                client.BeginRequest(restRequest, responseHandler);
            });
    }
}
...