我正在编写一个需要将非常大的文件(通常超过150MB)下载到机器中的应用程序。我知道WebClient有缓冲限制,能够在我的情况下使用。因此,我按照使用HttpWebRequest的方式在这里编写我的下载函数:http://dotnet.dzone.com/articles/2-things-you-should-consider?mz=27249-windowsphone7。以下是我的代码:
private void _downloadBook(string _filePath)
{
Uri _fileUri = new Uri(_filePath);
//DownloadFileName = System.IO.Path.GetFileName(_fileUri.LocalPath);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_fileUri);
request.AllowReadStreamBuffering = false;
request.BeginGetRequestStream(new AsyncCallback(GetData), request);
}
private void GetData(IAsyncResult result)
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
Stream str = response.GetResponseStream();
byte[] data = new byte[16 * 1024];
int read;
long totalValue = response.ContentLength;
while ((read = str.Read(data, 0, data.Length)) > 0)
{
if (streamToWriteTo.Length != 0)
Debug.WriteLine((int)((streamToWriteTo.Length * 100) / totalValue));
streamToWriteTo.Write(data, 0, read);
}
streamToWriteTo.Close();
Debug.WriteLine("COMPLETED");
}
但是,它使用以下堆栈抛出ProtocolViolationException:
System.Net.ProtocolViolationException未处理 消息= ProtocolViolationException 堆栈跟踪: 在System.Net.Browser.ClientHttpWebRequest.InternalBeginGetRequestStream(AsyncCallback回调,对象状态) 在System.Net.Browser.ClientHttpWebRequest.BeginGetRequestStream(AsyncCallback回调,对象状态) 在HHC_EbookReaderWP7.ComicPage._downloadBook(String _filePath) 在HHC_EbookReaderWP7.ComicPage.b__2() 在System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi,Object obj,BindingFlags invokeAttr,Binder binder,Object parameters,CultureInfo culture,Boolean isBinderDefault,Assembly caller,Boolean verifyAccess,StackCrawlMark& stackMark) 在System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化,StackCrawlMark& stackMark) 在System.Reflection.MethodBase.Invoke(Object obj,Object []参数) 在System.Delegate.DynamicInvokeOne(Object [] args) 在System.MulticastDelegate.DynamicInvokeImpl(Object [] args) 在System.Delegate.DynamicInvoke(Object [] args) 在System.Windows.Threading.DispatcherOperation.Invoke() 在System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority) 在System.Windows.Threading.Dispatcher.OnInvoke(对象上下文) 在System.Windows.Hosting.CallbackCookie.Invoke(Object [] args) 在System.Windows.Hosting.DelegateWrapper.InternalInvoke(Object [] args) 在System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle,Int32 nParamCount,ScriptParam [] pParams,ScriptParam& pResult)
我的代码有什么问题?还是我需要进一步了解它?感谢。
答案 0 :(得分:0)
http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetrequeststream.aspx
正如adontz所说。给我们抛出异常的确切行。并根据silverlight doc。你需要调用begingetresponsestream而不是同步。的GetResponseStream。它还向您展示了协议违规异常的一些原因。请使用WP7文档进行检查。
要获得异常的确切行,请转到Debug在vs2010的顶部菜单栏中并转到例外并启用“Thrown”的复选框
希望这有帮助。