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