【问题标题】:Expectation Failed when trying to update twitter status尝试更新推特状态时预期失败
【发布时间】:2010-11-14 06:34:46
【问题描述】:

我似乎无法弄清楚这一点。无论我做什么,我都会不断收到“417 期望失败”错误。我看过的所有地方都说我需要摆脱 HttpWebRequest 的 Expect 标头。在 Web 请求 request.ServicePoint.Expect100Continue = false 上设置静态属性 ServicePointManager.Expect100Continue = false 或实例属性永远不会摆脱标头。我必须手动将其设置为 null 才能将其删除。

无论如何,我仍然收到 417 错误。我错过了什么?

private static readonly MessageReceivingEndpoint UpdateStatusEndpoint 
       = new MessageReceivingEndpoint("http://twitter.com/statuses/update.xml", HttpDeliveryMethods.PostRequest);

public static XDocument UpdateStatus(ConsumerBase twitter, string accessToken, string message)
{
    var data = new Dictionary<string, string>();
    data.Add("status", message);
    ServicePointManager.Expect100Continue = false; //Doesn't work
    HttpWebRequest request = twitter.PrepareAuthorizedRequest(UpdateStatusEndpoint, accessToken, data);

    request.ServicePoint.Expect100Continue = false; //setting here doesn't work either

    //request.Expect is still set at this point unless I explicitly set it to null.

    request.Expect = null;
    var response = twitter.Channel.WebRequestHandler.GetResponse(request); //Throws exception
    return XDocument.Load(XmlReader.Create(response.GetResponseReader()));
}

【问题讨论】:

  • 标题是什么样的? 417 是对 Expect: 标头的特定反应,因此,如果您确定您没有发送任何这些,那真的很奇怪。
  • 就在调用 GetResponse() 之前,“Expect”属性为空,并且标头集合不包含“Expect”标头。我将不得不与提琴手核对,看看它是否仍以某种方式被放入其中。我仍然无法解释为什么对“Expect100Continue = false”的调用都不起作用
  • DotNetOpenAuth 内置了 417 错误处理,因此您的应用甚至不必处理这种情况或将 Expect100Continue 设置为 false。您可以打开日志记录以便我们查看是否发生这种情况吗? dotnetopenauth.net:8000/wiki/CodeSnippets/Logging
  • 我可能还冒昧地建议,LinqToTwitter 附带的用于 DotNetOpenAuth 的示例本身没有这个问题。你能说出你在做什么不同的事情吗?
  • @andrew-arnott 是的,我会打开登录并回复您。我没有得到直接的 417 异常,它被包装在 DotNetOpenId 异常中(不确定框架抛出的实际异常是什么,但 417 异常是内部异常)。我对 LinqToTwitter 一无所知,并且会猜测我没有使用它。我从示例中的 ApplicationBlock 复制了 Twitter 代码,并尝试对其进行扩展以支持更新。

标签: c# .net twitter oauth dotnetopenauth


【解决方案1】:

DotNetOpenAuth 不直接设置或支持 except100Continue。如果 Channel 类中有属性就好了。

在调用“PrepareAuthorizedRequest”之前添加:

    ((HttpWebRequest)WebRequest.Create
(UpdateStatusEndpoint.Location)).ServicePoint.Expect100Continue = false;

Except100Continue 根据调用的 URL 设置。因此,您可以在创建连接之前进行设置。你甚至可以在配置文件中全局设置它。

  <system.net>
    <settings>
      <servicePointManager expect100Continue="false" />
    </settings>
  </system.net>

【讨论】:

  • DotNetOpenAuth 只使用了 HttpWebRequest 类,所以 Eric,DotNetOpenAuth 不支持 Expect100Continue 设置的原因是什么?
  • 设置 Twitter 的 ServicePoint.Expect100Continue 属性的更简洁的方法是ServicePointManager.FindServicePoint(UpdateStatusEndpoint.Location).Expect100Continue = false
  • 安德鲁,我在想物业:webRequest.ServicePoint.Expect100Continue = false;但经过一番重新思考,我认为,这并不重要。两者都可能会联系 ServicePointManager。
  • 通过 webrequest 可能会更明显。
【解决方案2】:

将期望设置为“expect:nothing”..这是我的代码:

var data = new Dictionary();

data.Add("status", status);

HttpWebRequest 请求 = twitter.PrepareAuthorizedRequest(UpdateStatusEndpoint, accessToken, data);

request.Expect = "expect:nothing";

var response = twitter.Channel.WebRequestHandler.GetResponse(request);例外 返回 XDocument.Load(XmlReader.Create(response.GetResponseReader()));

它对我有用...

【讨论】:

    【解决方案3】:

    LinqToTwitter 是一个使用 DotNetOpenAuth 的 Twitter 客户端库。我将看到有关将消息发布示例添加到 DotNetOpenAuth 核心库以供将来版本使用。

    【讨论】:

      猜你喜欢
      • 2011-06-19
      • 2011-12-05
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      • 2014-08-27
      • 1970-01-01
      相关资源
      最近更新 更多