当我想从Silverlight应用程序导出数据到.csv文件时,我遇到了非常相同的情况。在Internet Explorer中,我无法保存文件,因为请求没有发送到我用来从中检索数据的http处理程序。
最初的代码是这样的:
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(url, UriKind.Absolute));
request.BeginGetResponse(new AsyncCallback(ReadExportHandlerCallback), request);
,但它并没有在IE浏览器。 Fiddler向我展示了请求不会发送到http处理程序,我不知道为什么会发生这种情况。
我已经与下一个解决方案交流:使用流(内存,文件)为处理程序和异步方法BeginRequestStream()和EndGetRequestStream()发出请求。
// other code.
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url, UriKind.Absolute));
MemoryStream mStream = new MemoryStream();
var uploadRequest = new UploadRequest
{
MemoryStream = mStream,
Request = request
};
request.Method = "POST";
request.BeginGetRequestStream(OnGetRequestStream, uploadRequest);
}
public void OnGetRequestStream(IAsyncResult result)
{
var uploadRequest = (UploadRequest)result.AsyncState;
uploadRequest.MemoryStream.Seek(0, SeekOrigin.Begin);
try
{
// upload bytes to the server
using (var stream = uploadRequest.Request.EndGetRequestStream(result))
{
var buffer = new byte[uploadRequest.MemoryStream.Length];
int bytesRead;
while ((bytesRead = uploadRequest.MemoryStream.Read(buffer, 0, buffer.Length)) != 0)
{
stream.Write(buffer, 0, bytesRead);
}
}
// async get response
uploadRequest.Request.BeginGetResponse(new AsyncCallback(ReadExportHandlerCallback), uploadRequest);
}
catch (Exception)
{
}
finally
{
// ensure file is properly closed after sending either succeeded or failed
uploadRequest.MemoryStream.Close();
}
}
private void ReadExportHandlerCallback(IAsyncResult asynchronousResult)
{
var uploadRequest = (UploadRequest)asynchronousResult.AsyncState;
var response = (HttpWebResponse)uploadRequest.Request.EndGetResponse(asynchronousResult);
using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))
{
_data = streamReader.ReadToEnd();
_dataReceived = true;
}
}
的UploadRequest类是含有2个属性的自定义类:一个MemoryStream和HttpWebRequest的。
public class UploadRequest
{
#region Fields
private MemoryStream _memoryStream;
private HttpWebRequest _httpWebRequest;
#endregion
#region Properties
/// <summary>
/// The stream that will be sent to the handler.
/// </summary>
public MemoryStream MemoryStream
{
get
{
return _memoryStream;
}
set
{
_memoryStream = value;
}
}
/// <summary>
/// The request that contains the stream.
/// </summary>
public HttpWebRequest Request
{
get
{
return _httpWebRequest;
}
set
{
_httpWebRequest = value;
}
}
希望帮助!
@ndim感谢您解决输入错误 – cofiem
您可以尝试模拟上传,而不实际发送任何数据,而只是读取文件块,转换为字节,并继续? –
不错的主意......当我可以的时候我会回到这个位置,并尝试一下。 – cofiem