Я пишу приложение, которое должно загружать на компьютер файлы очень большого размера (обычно более 150 МБ).Я знал, что 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 было необработанным., Состояние объекта) в HHC_EbookReaderWP7.ComicPage._downloadBook (String _filePath) в HHC_EbookReaderWP7.ComicPage.b__2 () в System.Reflection.RuntimeMethodInfo.InternalInvoke (RuntimeMethodInfo rtmi, объектная привязка объекта, объектная ссылка на объект, объектная ссылка на объект, объектная ссылка на объект, объектная ссылка на объект, объектная ссылка на объект, объектная ссылка на объект, объектная ссылка на объект, связывание объектаisBinderDefault, вызывающая сборка, логический verifyAccess, StackCrawlMark & stackMark) в System.Reflection.RuntimeMethodInfo.InternalInvoke (Object obj, BindingFlagsinvokeAttr, связыватель Binder, параметры Object [], культура CultureInfo, StackCrawlMark & stackMark) в System.Reflection.MethodBase.Invoke (параметры Object obj, Object []) в System.Delegate.DynamicInvokeOne (аргументы Object []) в System.MulticastDelegate.DynamicInvokeImpl (Object [] args) в System.Delegate.DynamicInvoke (Object [] args) в System.Windows.Threading.DispatcherOperation.Invoke () в System.Windows.Threading.Dispatcher.Dispatch (приоритет DispatcherPriority) в 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)
Что-то не так с моим кодом?или мне нужно дальше на это?Спасибо.