gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:55:28 37 4
gpt4 key购买 nike

我们有一个使用 WCF 构建的 REST API。

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

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

这工作得很好,除了在我们使用流进行 Post 的一种情况下。

一个例子:
[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 语句中处理此流时,每当我们遇到异常时,我们都会得到:

来自 fiddler :
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>

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

然后我尝试删除任何会处理 StreamReader 的东西,这确实有效。处理这个的代码现在看起来像这样:

enter image description here

这解决了发送正确异常消息的问题,但这会对我们的应用程序产生多大影响,而不是关闭或处置我们的 StreamReader?
你看到任何其他方法来解决这个问题吗?

最佳答案

发生这种情况是因为 StreamReader 接管了流的“所有权”。换句话说,它让自己负责关闭源流。一旦您的程序调用 Dispose 或 Close(在您的情况下离开 using 语句范围),它也会处理源流。在您的情况下调用 sr.Dispose() 。所以文件流死了。

如果你不想要这个,你可以创建一个从 StreamReader 继承的新类并覆盖 Close 方法;在您的 Close 方法中,调用不关闭流的 Dispose(false)。

您也可以使用 NonClosingStreamWrapper Jon Skeet 的类(class) MiscUtil图书馆,它正是为了这个目的。

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

关于.net - 使用流并关闭流时出现错误的 WebFaultException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13622537/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com