当我尝试使用HttpWebRequest时,为什么会出现ProtocolViolationException异常?

5

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

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

我有以下设置(忽略错误的url,这只是一个例子..)
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..这会导致问题吗? 谢谢。


请发布完整的异常,并向我们展示异常发生的位置。此外,在SomeCallback中,您需要将IDisposable实例放置在using块中。HttpWebResponse、StreamReader甚至是Stream都需要在using块中,否则您将泄漏资源。 - John Saunders
在我的问题中添加了异常..并且我已经修改为使用"using"块,这是可以的。问题仍然存在。 - djbyter
不确定这是否是正确的地方来请求,但您能否将Windows-Phone-7标签添加到此帖子中? - CACuzcatlan
4个回答

15

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


8

我猜测问题出在你设置了 'ContentType' 头部,但请求中没有提供内容。请注意,在尝试创建请求时会抛出协议异常。

你可能想要将 'Accept' 头部设置为 "text/xml" 而不是内容类型头部。


这就是问题所在。谢谢Paul。 - djbyter

1

如果请求中包含“Content-Type”头和“GET”一起使用,会导致异常。在Azure Table REST API中,需要将ContentType编码到auth头中 - 对于GET的头部“ContentType”,请使用空字符串。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接