.net 使用流并关闭流时出现错误的WebFaultException
我们有一个用WCF构建的RESTAPI 我们使用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
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& 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而不处理它,因为它不能清理任何非托管资源