当我从WebRequest返回Stream时遇到问题,它说流已关闭,当我拥有相同方法的所有内容时,它在这里工作的是代码示例:
public static Stream MethodOne()
{
Uri uri = new Uri(url, true);
WebRequest request = WebRequest.Create(uri);
request.Method = "GET";
Stream responseStream = null;
using (WebResponse webResponse = request.GetResponse())
{
responseStream = webResponse.GetResponseStream();
}
}
另一种方法是:
public static XDocument MethodTwo()
{
Stream stream = MethodOne();
if (stream == null)
{
return null;
}
XmlReader xmlReader = XmlReader.Create(stream);
return XDocument.Load(xmlReader);
}
我得到的错误是我尝试使用以下消息从流创建xmlReader:请求已中止:连接意外关闭。
知道怎么解决吗?
答案 0 :(得分:1)
你的using语句在读取流之前调用了Dispose。
我会从方法一返回WebResponse。
public static XDocument MethodTwo()
{
WebResponse response = MethodOne();
if (response == null)
{
response null;
}
try
{
var stream = response.GetResponseStream();
XmlReader xmlReader = XmlReader.Create(stream);
return XDocument.Load(xmlReader);
}
finally
{
response.Dispose();
}
}
更新:更好的解决方案
public static XDocument MethodTwo()
{
using (var response = MethodOne())
using (var stream = response.GetResponseStream())
{
var stream = response.GetResponseStream();
XmlReader xmlReader = XmlReader.Create(stream);
return XDocument.Load(xmlReader);
}
}
public static Stream MethodOne()
{
Uri uri = new Uri(url, true);
WebRequest request = WebRequest.Create(uri);
request.Method = "GET";
return request;
}
这将确保您的资源被处置(即使发生异常)。
答案 1 :(得分:0)
正如SchlaWiener指出的那样,您遇到的问题是using
语句在您可以读取流之前调用流上的Dispose()
。您应该按如下方式重构代码:
public static Stream GetResponseStream()
{
var uri = new Uri(url, true);
WebRequest request = WebRequest.Create(uri);
request.Method = WebRequestMethods.Http.Get;
WebResponse response = request.GetResponse();
return response.GetResponseStream();
}
public static XDocument GetXDocument()
{
using(Stream stream = GetResponseStream())
{
XmlReader xmlReader = XmlReader.Create(stream);
return XDocument.Load(xmlReader);
}
}
这样,您将确保仅在读取后关闭流。