using语句更改返回值

时间:2014-08-19 21:31:57

标签: c# using-statement

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

2 个答案:

答案 0 :(得分:3)

我不知道您在运行此代码的上下文类型以及您对该流做了什么,但这是我的推理。

WebResponseIDisposable,这意味着当您将其放入using语句时,它将被置于范围的末尾。

  1. 您正在处置WebResponse实例:webResponse
  2. webResponse在处置完毕后会处置自己的所有IDisposable
  3. webResponse处理响应流:stream
  4. 您的test函数返回stream
  5. stream无法使用,因为它已被丢弃。
  6. 问题!
  7. 修改

    回答你的意见:

    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需要产生数据的资源,从而阻止它被进一步使用。

完成使用该流后,您需要处理资源