5

我不知道。我正在尝试从我为 Windows Phone 构建的应用程序上的 REST 服务获取 XML。我总是在以下行遇到异常:

HttpWebResponse response = request.EndGetResponse(ar) as HttpWebResponse;

我有以下设置(忽略错误的网址,这只是一个示例..)

HttpWebRequest request = WebRequest.Create("https://domain.chargify.com/customers.xml") as HttpWebRequest;
NetworkCredential credentials = new NetworkCredential("appkeyhere", "password");
request.Credentials = credentials;
request.Method = "GET";
request.ContentType = "text/xml";
request.BeginGetResponse(new AsyncCallback(SomeCallback), request);
...
private void SomeCallback(IAsyncResult ar) {
    HttpWebRequest request = ar.AsyncState as HttpWebRequest;
    HttpWebResponse response = request.EndGetResponse(ar) as HttpWebResponse;
    StreamReader reader = new StreamReader(response.GetResponseStream());
    XElement xmlResult = XElement.Parse(reader.ReadToEnd());
    ...
}

例外情况如下:

System.Net.ProtocolViolationException was unhandled
Message=ProtocolViolationException
  StackTrace:
       at System.Net.Browser.ClientHttpWebRequest.PrepareAndSendRequest(String method, Uri requestUri, Stream requestBodyStream, WebHeaderCollection headerCollection, CookieContainer cookieContainer)
       at System.Net.Browser.ClientHttpWebRequest.BeginGetResponseImplementation()
       at System.Net.Browser.ClientHttpWebRequest.InternalBeginGetResponse(AsyncCallback callback, Object state)
       at System.Net.Browser.AsyncHelper.BeginOnUI(BeginMethod beginMethod, AsyncCallback callback, Object state)
       at System.Net.Browser.ClientHttpWebRequest.BeginGetResponse(AsyncCallback callback, Object state)
       at ChargifyWPA.MainPage.button1_Click(Object sender, RoutedEventArgs e)
       at System.Windows.Controls.Primitives.ButtonBase.OnClick()
       at System.Windows.Controls.Button.OnClick()
       at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
       at System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
       at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, String eventName)

有人有想法么?它是https,而不是http ..是导致问题的原因吗?谢谢。

4

4 回答 4

15

这不是你的问题,但它可能会帮助其他人。我遇到了这个问题,因为我在 GET 请求上调用 BeginGetRequestStream()。当然,这不是必需的,我应该只是调用 BeginGetResponse()。愚蠢的错误,但如果错误消息更有帮助,我会更快地发现它。

于 2010-11-11T21:04:10.660 回答
8

我敢打赌这个问题是因为您设置了“ContentType”标头,但没有在您的请求中提供内容。请注意,在尝试创建请求时会引发协议异常。

您可能的意思是将“接受”标头设置为“text/xml”而不是内容类型标头。

于 2011-05-03T23:10:57.103 回答
1

如果请求中存在带有“GET”的“Content-Type”标头,则会导致异常在 Azure Table REST API 中,尽管需要将 ContentType 编码为 auth 标头 - 对 GET 标头的“ContentType”使用空字符串

于 2011-10-28T13:35:52.887 回答
0

显然,如今桌面上出现此错误的最常见原因是需要 SSL 而不是 TLS 身份验证的 Web 服务器。请参阅本文的所有评论,这些评论解释了各种 .NET 2 HTTP 错误的故障排除选项。看来您在 CodePlex 上获得 MIT 许可的 Chargify.NET 项目已经在使用此解决方法(“SecurityProtocolType.Ssl3”)。

从大约 2008 年的另一篇文章中可以尝试的其他选项是回退到 HTTP/1.0 或禁用 Keep-Alive。

一定要试试这个答案,删除 ContentType 初始化。

于 2010-10-26T02:14:40.537 回答