Using语句改变返回值



我有下面的代码,按预期工作。在下面,我想我会添加一些使用语句,以确保一切都被正确处理,但当我这样做时,我得到一个没有数据收到的错误页面在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;
    }
}

我不知道你在什么样的上下文中运行这段代码,以及你对那个流做了什么,但这里是我的推理。

WebResponseIDisposable,这意味着当您将其放入using语句时,它将在作用域结束时被处理。

  1. 你正在处理WebResponse实例:webResponse .
  2. webResponse在被处理时将自己所有的IDisposable处理掉。
  3. webResponse处置响应流:stream .
  4. 你的test函数返回stream
  5. stream不可用,因为它已被处理。
  6. 问题!
编辑:

回答你的评论:

这就是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产生其数据所需的资源,从而防止它被进一步使用。

您需要在使用完流之后处置资源

最新更新