1

DotNetOpenAuth是一个了不起的包。但是,我不断遇到一些障碍。到现在大部分都解决了,现在我遇到了一个问题,这占用了我很多时间。

问题:我想使用 DotNetOpenAuth 在linkedin 上分享一篇文章。前段时间我可以分享一些帖子,但突然之间事情已经坏了,我不能再发布分享了。我不记得对我的代码进行了太多更改。有人可以看看我的诊断,代码,看看我是否搞砸了?

诊断:我在通过我的代码和 LinkedIn 的Rest Console发出请求时运行了 fiddler 。以下是两种场景的 Fiddler 输出:

通过 Linkedin 提供的 Rest Console 发出的请求的 Fiddler 输出

POST /v1/people/~/shares HTTP/1.1
Authorization: OAuth oauth_consumer_key="{consumer_key}",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1362258084",oauth_nonce="-141812272",oauth_version="1.0",oauth_token="{access_token}",oauth_signature="HBMUfvHYJAxz%2BszxStVJ%2BhfQPEQ%3D"
Host: api.linkedin.com
Content-Length: 645
X-Target-URI: http://api.linkedin.com
Content-Type: application/xml
Connection: Keep-Alive

<?xml version="1.0" encoding="UTF-8"?>
<share>
    <comment>test comment</comment>
    <content>
        <title>test title</title>
        <submitted-url>{my_test_url}</submitted-url>
        <submitted-image-url>{my_image_url}</submitted-image-url>
    </content>
    <visibility>
        <code>anyone</code>
    </visibility>
</share>

通过我的代码发出的请求的提琴手输出(使用 DNOA):

POST http://api.linkedin.com/v1/people/~/shares HTTP/1.1
Authorization: OAuth oauth_token="{access_token}",oauth_consumer_key="{my_consumer_key}",oauth_nonce="ECYFLc0l",oauth_signature_method="HMAC-SHA1",oauth_signature="FobR745YkMlmBpOqoTDr8CwGZIQ%3D",oauth_version="1.0",oauth_timestamp="1362263560"
Content-Type: application/xml
Host: api.linkedin.com
Content-Length: 510
Connection: Keep-Alive

<?xml version="1.0" encoding="UTF-8"?>
  <share>
    <comment>test comment</comment>
    <content>
      <title>test title</title>
      <description>test description</description>
      <submitted-url>{my_test_url}</submitted-url>
      <submitted-image-url>{my_image_url}</submitted-image-url>
    </content>
    <visibility>
      <code>anyone</code>
    </visibility>
  </share>

更多细节:

我知道在执行 oauth 身份验证时我需要通过范围,所以已经有了这个。当用户授权我的应用程序时,我还会收到正确的权限提示,显示为“网络更新以您的身份检索并发布更新到 LinkedIn”

请注意,我确实获得了访问令牌,并且我能够执行一些读取操作,例如使用此令牌获取用户详细信息,但是,我无法使用该令牌在 LinkedIn 上共享帖子。目前实施使用的是LinkedIn oAuth 1.0a。

这也是我的代码块:

public bool PostToLinkedIn(WebConsumer consumer, string sShareMessageXml, string accessToken = null)
{
    var payload = Encoding.ASCII.GetBytes(sShareMessageXml);

    AuthorizedTokenResponse token = null;
    bool bIsAccessTokenSupplied = !string.IsNullOrEmpty(accessToken);
    if (!bIsAccessTokenSupplied)
    {
        token = consumer.ProcessUserAuthorization();
    }
    if (token != null || bIsAccessTokenSupplied)
    {
        this.AccessToken = bIsAccessTokenSupplied ? accessToken : token.AccessToken;

        var resourceEndpoint = new MessageReceivingEndpoint("http://api.linkedin.com/v1/people/~/shares", HttpDeliveryMethods.PostRequest | HttpDeliveryMethods.AuthorizationHeaderRequest);
        HttpWebRequest request = consumer.PrepareAuthorizedRequest(resourceEndpoint, AccessToken);
        request.ServicePoint.Expect100Continue = false;
        request.Method = "POST";
        request.ContentLength = payload.Length;
        request.ContentType = "application/xml";

        using (Stream requestStream = request.GetRequestStream())
        {
            requestStream.Write(payload, 0, payload.Length);
        }

        var response = consumer.Channel.WebRequestHandler.GetResponse(request);

        var responseData = response.GetResponseReader().ReadToEnd();

        var xmlData = XDocument.Parse(responseData);

        if (xmlData.Elements(XName.Get("update")).Any())
        {
            return true;
        }
    }
    return false;
}

如果您需要更多详细信息,请告诉我。任何帮助都会很棒。

我也在 DNOA 的 google 组上发布了相同问题的简短版本。希望有人遇到过这个问题并有解决方案。

4

0 回答 0