2010-03-19 40 views
5

我不知道。我正在尝试从我为Windows Phone构建的应用上的REST服务中获取XML。为什么在尝试使用HttpWebRequest时收到ProtocolViolationException?

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 ..是否导致此问题? 谢谢。

+0

请发布完整的例外,并告诉我们发生异常的地方。另外,在SomeCallback中,您需要将您的IDisposable实例放入使用块中。 HttpWebResponse,StreamReader甚至Stream都需要使用''blocks',否则你会泄漏资源。 – 2010-03-19 20:13:18

+0

添加了我的问题的例外..我修改了使用“使用”块,这很好。问题仍然存在。 – djbyter 2010-03-23 14:16:05

+0

不知道这是否是请求它的正确位置,但是您能否将Windows-Phone-7标记添加到此文章中? – CACuzcatlan 2010-12-07 23:00:34

回答

8

我敢打赌,这个问题是因为你设置了'ContentType'标题,但没有在你的请求中提供内容。请注意,协议异常在尝试创建请求时被抛出。

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

+0

这是问题所在。谢谢保罗。 – djbyter 2013-01-29 17:39:36

0

显然,桌面上这种错误最常见的原因是Web服务器需要SSL而不是TLS身份验证。查看关于this article explaining troubleshooting options for various .NET 2 HTTP errors的所有评论。它看起来在CodePlex上的MIT许可的Chargify.NET项目已经是using this work-around(“SecurityProtocolType.Ssl3”)。

another article circa 2008尝试的其他选项正在回退到HTTP/1.0或禁用Keep-Alive。

务必尝试this answer,删除ContentType初始化。

15

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

1

“ContentType的”标头“GET”导致它需要的ContentType编码成AUTH头虽然异常,如果出现在请求 在Azure Table中REST API - 使用空字符串GET的头的“的ContentType”

相关问题