我有以下代码按预期工作。在下面,我想我会添加一些使用语句,以确保一切都正确处理,但当我这样做时,我得到一个没有数据收到错误页面在铬。如果这是因为using语句正在处理(只有我可以想到...)webresponse对象的可能性,我该怎样才能返回流并正确处理webresponse?当对此代码不同的Web服务进行调用时,将返回流,这会导致文件上载到客户端。至少它适用于给定的第一个例子。
public Stream test(string fileName) //this works fine
{
WebResponse webResponse = webRequest.GetResponse();
Stream stream = webResponse.GetResponseStream();
context.OutgoingResponse.Headers["Content-Disposition"] = string.Format("filename= {0}", fileName);
return stream;
}
public Stream test(string fileName)///gives No data recieved error in chrome
{
WebResponse webResponse;
using(webResponse = webRequest.GetResponse())
{
Stream stream = webResponse.GetResponseStream();
context.OutgoingResponse.Headers["Content-Disposition"] = string.Format("filename= {0}", fileName);
return stream;
}
}
答案 0 :(得分:3)
我不知道您在运行此代码的上下文类型以及您对该流做了什么,但这是我的推理。
WebResponse
是IDisposable
,这意味着当您将其放入using
语句时,它将被置于范围的末尾。
webResponse
。webResponse
在处置完毕后会处置自己的所有IDisposable
。webResponse
处理响应流:stream
。test
函数返回stream
。stream
无法使用,因为它已被丢弃。修改强>
回答你的意见:
IDisposable
IDisposable
对象的工作方式
这是典型的// ExampleClass is similar to WebResponse
public class ExampleClass: IDisposable
{
private IDisposable somethingDisposable;
private bool disposed = false;
public ExampleClass()
{
somethingDisposable = new ...
...
}
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
// Check to see if Dispose has already been called.
if(!this.disposed)
{
if(disposing)
{
// Your stream is disposed similar to
// what happens here:
// IDisposable objects dispose all managed/unmanaged
// resources that they have in their Dispose function.
somethingDisposable.Dispose();
}
disposed = true;
}
}
// This is similar to WebResponse.GetResponseStream
public IDisposable GetSomethingDisposable()
{
return somethingDisposable;
}
}
public static void Main()
{
IDisposable d;
using(var e = new ExampleClass()) {
d = e.GetSomethingDisposable();
}
// here both e and d are disposed.
}
类实现:
{{1}}
答案 1 :(得分:1)
当你清理响应的资源时,你已经清理了你传递的Stream
需要产生数据的资源,从而阻止它被进一步使用。
完成使用该流后,您需要处理资源。