Using语句改变返回值
本文关键字:返回值 改变 语句 Using | 更新日期: 2023-09-27 18:18:40
我有下面的代码,按预期工作。在下面,我想我会添加一些使用语句,以确保一切都被正确处理,但当我这样做时,我得到一个没有数据收到的错误页面在chrome。如果这是因为using语句是处置(唯一的可能性,我能想到…)的webresponse对象,我怎么能返回流和处置正确的webresponse ?当对web服务进行调用时,流被返回,这段代码是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;
}
}
我不知道你在什么样的上下文中运行这段代码,以及你对那个流做了什么,但这里是我的推理。
WebResponse
是IDisposable
,这意味着当您将其放入using
语句时,它将在作用域结束时被处理。
- 你正在处理WebResponse实例:
webResponse
. -
webResponse
在被处理时将自己所有的IDisposable
处理掉。 -
webResponse
处置响应流:stream
. - 你的
test
函数返回stream
。 -
stream
不可用,因为它已被处理。 - 问题!
回答你的评论:
这就是IDisposable
对象在http://msdn.microsoft.com/en-us/library/system.idisposable(v=vs.110).aspx
下面是一个典型的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.
}
当您为响应清理资源时,您已经清理了您要传递的Stream
产生其数据所需的资源,从而防止它被进一步使用。
您需要在使用完流之后处置资源。