Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用语句更改返回值_C#_Using Statement - Fatal编程技术网

C# 使用语句更改返回值

C# 使用语句更改返回值,c#,using-statement,C#,Using Statement,我有下面的代码可以正常工作。下面我想我会添加一些using语句来确保一切都被正确处理,但当我这样做时,我会在chrome中得到一个No data received error页面。如果这是因为using语句正在处理webresponse对象(我能想到的唯一可能性是…),那么如何返回流并正确地处理webresponse?当对web服务进行调用时,将返回流。此代码是其中的一部分,这将导致文件上载到客户端。至少在给出的第一个示例中它是有效的 public Stream test(string file

我有下面的代码可以正常工作。下面我想我会添加一些using语句来确保一切都被正确处理,但当我这样做时,我会在chrome中得到一个No data received error页面。如果这是因为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;
    }
}

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

WebResponse
IDisposable
,这意味着当您使用
语句将其放入
中时,它将在作用域的末尾被释放

  • 您正在处理WebResponse实例:
    WebResponse
  • webResponse
    在处置所有
    IDisposable
    s时处置其自身的所有
    IDisposable
    s
  • webResponse
    处理响应流:
    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.
    }
    

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

    WebResponse
    IDisposable
    ,这意味着当您使用
    语句将其放入
    中时,它将在作用域的末尾被释放

  • 您正在处理WebResponse实例:
    WebResponse
  • webResponse
    在处置所有
    IDisposable
    s时处置其自身的所有
    IDisposable
    s
  • webResponse
    处理响应流:
    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.
    }
    

    当您清理响应的资源时,您已经清理了要传递的
    生成其数据所需的资源,从而防止它被进一步使用


    在使用完该流后,您需要处置该资源。

    当您清理响应的资源时,您已经清理了要传递的
    流产生其数据所需的资源,从而防止其被进一步使用


    在使用完该流后,您需要处置该资源。

    您对该流做了什么?在问题末尾添加了该信息。@X-li感谢您改进了帖子。但请只做实质性的修改。在您的更改获得批准之前,至少需要3个人对其进行审查。这需要审稿人的时间。值得一试,并将次要编辑留给有足够代表性的用户进行编辑,无需批准。谢谢。你们用这个流做什么?在问题的末尾添加了那个些信息。@X-li感谢你们改进了帖子。但请只做实质性的修改。在您的更改获得批准之前,至少需要3个人对其进行审查。这需要审稿人的时间。值得一试,并将次要编辑留给有足够代表性的用户进行编辑,无需批准。谢谢。我这么想,但是为什么它要处理包含数据的变量呢?它只会处理那些直接从处理对象那里来的对象,当然?@No1_Melman流不包含数据-这是一种从源获取数据的机制。当流被释放时,您获取数据的能力也会随之提高。您需要在请求完成之前不处理该请求,或者不返回流(而是返回二进制数据)。+1@No1_Melman-
    Dispose
    处理对象和该对象“拥有”的任何东西,即在您的情况下,WebRespose拥有头、响应流。有些对象(如headers collection)可以在“disposed”状态之后使用(或者根本没有特定的“disposed”状态,也没有相应的
    Dispose
    ),其他对象(如大多数
    Steam
    -派生对象)在处理后完全无用,正如您刚刚发现的那样。另一种常见情况是
    Writer
    对象处理其内部流。@DStanley或任何人……如何获取二进制数据?@Timigen使用
    Stream
    的各种
    Read
    函数。我想是这样,但它为什么要处理包含数据的变量?它只会处理那些直接从处理对象那里来的对象,当然?@No1_Melman流不包含数据-这是一种从源获取数据的机制。当流被释放时,您获取数据的能力也会随之提高。您需要在请求完成之前不处理该请求,或者不返回流(而是返回二进制数据)。+1@No1_Melman-
    Dispose
    处理对象和该对象“拥有”的任何东西,即在您的情况下,WebRespose拥有头、响应流。有些对象(如headers collection)可以在“disposed”状态之后使用(或者根本没有特定的“disposed”状态,也没有相应的
    Dispose
    ),其他对象(如大多数
    Steam
    -派生对象)在处理后完全无用,正如您刚刚发现的那样。另一种常见的情况是
    Writer
    处理其内部流的对象。@DStanley或其他任何人……我如何获得