Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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
.net 使用流并关闭流时出现错误的WebFaultException_.net_Wcf_Rest_Exception_Exception Handling - Fatal编程技术网

.net 使用流并关闭流时出现错误的WebFaultException

.net 使用流并关闭流时出现错误的WebFaultException,.net,wcf,rest,exception,exception-handling,.net,Wcf,Rest,Exception,Exception Handling,我们有一个用WCF构建的RESTAPI 我们使用WebFaultException处理所有后端异常,如下所示: throw new WebFaultException<string>(e.Message, HttpStatusCode.NotAcceptable); 在using语句中处理此流时,无论何时遇到异常,我们都会得到: 来自小提琴手: HTTP/1.1 400 Bad Request <p>The server encountered an error

我们有一个用WCF构建的RESTAPI

我们使用WebFaultException处理所有后端异常,如下所示:

throw new WebFaultException<string>(e.Message, HttpStatusCode.NotAcceptable);
在using语句中处理此流时,无论何时遇到异常,我们都会得到:

来自小提琴手:

HTTP/1.1 400 Bad Request 
  <p>The server encountered an error processing the request. The exception message is 'The message object has been disposed.'. See server logs for more details. The exception stack trace is: </p>
  <p>  at System.ServiceModel.Channels.ByteStreamMessage.InternalByteStreamMessage.get_Properties()
   at System.ServiceModel.OperationContext.get_IncomingMessageProperties()
   at System.ServiceModel.Dispatcher.WebErrorHandler.ProvideFault(Exception error, MessageVersion version, Message&amp; fault)</p>
HTTP/1.1400错误请求
服务器在处理请求时遇到错误。异常消息为“消息对象已被释放”。有关详细信息,请参阅服务器日志。异常堆栈跟踪为:

在System.ServiceModel.Channels.ByTestStreamMessage.InternalByTestStreamMessage.get_Properties()中 在System.ServiceModel.OperationContext.get_IncomingMessageProperties()中 位于System.ServiceModel.Dispatcher.WebErrorHandler.ProviderDefault(异常错误、MessageVersion版本、消息和故障)

看起来它与正在处理的流和StreamReader有关

然后,我尝试删除任何会处理StreamReader的内容,这一点也能正常工作。处理此问题的代码现在如下所示:

throw new WebFaultException<string>(e.Message, HttpStatusCode.NotAcceptable);

这解决了发送正确异常消息的问题,但这会对我们的应用程序造成多大的影响,而不是关闭或处理我们的StreamReader?
你有没有其他的解决方法

这是因为StreamReader接管了流的“所有权”。换句话说,它使自己负责关闭源流。只要您的程序调用Dispose或Close(在您的情况下保留using语句作用域),那么它也将处理源流。在您的案例中调用sr.Dispose()。因此,文件流在之后就死了

如果您不希望这样,您可以创建一个新类,该类继承自StreamReader并重写Close方法;在Close方法中,调用Dispose(false),它不会关闭流

您还可以使用Jon Skeet库中的
NonClosingStreamWrapper
类,它正是用于此目的

但是最好不要离开StreamReader而不处理它,因为它不能清理任何非托管资源