0

对不起,如果我问的问题是无稽之谈,因为我对此真的很陌生。:(

我有一个项目已经在使用 Hammock 进行 oAuth(1.0 版)身份验证。然后我看到了 Shawn Burke 令人敬畏的数据缓存框架 AgFx,我真的希望能够在我的项目中使用它。

但我遇到的问题是,使用 Hammock 我可以轻松地使用

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 签名字符串。然后基本上我需要扔掉 Hammock 给我的东西并重写代码以获得签名。

我只是想知道是否有更好的方法来做到这一点?或者我应该说是否有一个库可以用来轻松获取此签名?

任何帮助将非常感激!!

干杯,

4

1 回答 1

3

我已经想通了。

创建这个框架的 Shawn Burke 为我指明了正确的方向。

基本上我所做的是我创建了一个从 AgFx 的 LoadRequest 继承的 HammockLoadRequest,并在 Execute 覆盖中,将 HttpWebRequest 替换为 Hammock 的 RestRequest,仅此而已。

    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);
            });
    }
}
于 2011-08-24T13:01:00.187 回答