我们有一个使用 WCF 构建的 REST API。
我们使用 WebFaultException 处理所有后端异常,如下所示:
throw new WebFaultException<string>(e.Message, HttpStatusCode.NotAcceptable);
除了我们使用流进行发布的一种情况之外,这工作得很好。
一个例子:
[WebInvoke(Method = "POST", UriTemplate = "saveUser?sessionId={sessionId}&userId={userId}",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.WrappedRequest)]
[OperationContract]
string SaveUser(string sessionId, int userId, Stream stream);
当在 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>
看起来这与流和 StreamReader 的处理有关。
然后我尝试删除任何会处置 StreamReader 的内容,这实际上是有效的。处理这个问题的代码现在看起来像这样:
这解决了发送正确异常消息的问题,但是如果不关闭或处置 StreamReader,这会对我们的应用程序产生多严重的影响?
您还看到其他解决此问题的方法吗?