Работа с гамаком и приложением AgFx для Windows phone 7

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

У меня есть проект, который уже использует гамак для проверки подлинности 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 ответ

Решение

Я понял это.

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

По сути, я создал 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);
            });
    }
}
Другие вопросы по тегам