我正在使用Windows Phone SDK 7,并试图实现图像文件的下载。我不能使用标准的BitmapImage对象,因为我的服务器使用表单认证cookie,我就我所知,没有办法通过浏览器控件或BitmapImage对象的cookie容器…(顺便说一句。如果有办法做到这一点,我也想知道-它会使我的代码更简单!)。
无论如何,我要做的应该是可能的-我得到一个响应流,现在我需要从它读取图像数据。
不管
_clientData.BeginRead(_buffer, _currentPosition, _buffer.Length, new AsyncCallback(ReadCallback), null);
返回错误:
Specified argument was out of the range of valid values.
Parameter name: count
at MS.Internal.InternalNetworkStream.BeginRead(Byte[] buffer, Int32 offset, Int32 count, AsyncCallback callback, Object state)
at TestCode.ItemViewModel.ReadImageByChunks()
at TestCode.ItemViewModel.ReadCallback(IAsyncResult ar)
at MS.Internal.InternalNetworkStream.StreamAsyncResult.Complete(Int32 bytesProcessed, Boolean synchronously, Exception error)
at MS.Internal.InternalNetworkStream.ReadOperation(Object state)
at MS.Internal.InternalNetworkStream.BeginRead(Byte[] buffer, Int32 offset, Int32 count, AsyncCallback callback, Object state)
at TestCode.ItemViewModel.ReadImageByChunks()
at TestCode.ItemViewModel.<>c__DisplayClassb.<LoadImageFromServer>b__a(IAsyncResult rspAR)
at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.<InvokeGetResponseCallback>b__8(Object state2)
at System.Threading.ThreadPool.WorkItem.doWork(Object o)
at System.Threading.Timer.ring()
这不会在第一次通过代码时发生(当clientData.Position==0时)。第二次通过它总是被抛出(当clientData.Position==4096时)。
count是_buffer.Length。
private void ReadImageByChunks()
{
try
{
_clientData.BeginRead(_buffer, _currentPosition, _buffer.Length, new AsyncCallback(ReadCallback), null);
}
catch (Exception error)
{
int i = 1;
}
}
private void ReadCallback(IAsyncResult ar)
{
try
{
int bytesRead = _clientData.EndRead(ar);
if (bytesRead > 0)
{
_imageStream.Write(_buffer, _currentPosition, bytesRead);
_currentPosition = _currentPosition + bytesRead;
}
if (bytesRead == _buffer.Length)
ReadImageByChunks();
else
{
//do stuff
}
}
catch (Exception error)
{
int i = 1;
}
}
根据我自己的直觉和在网上找到的代码,我已经重写了几次这段代码(但没有针对Windows Phone 7的)。上面的版本是基于这篇文章。但到目前为止还没有运气。任何帮助都会很感激。 不要将索引传递给BeginRead,因为它引用了缓冲区的索引,以便开始写入。当前请求向缓冲区边界外写入数据。
将_currentPosition替换为0,应该可以解决这个问题。实际上,您根本不需要跟踪_currentPosition,因为流保持自己的状态。