WCF で構築された REST API があります。
次のように、すべての例外バックエンドを WebFaultException で処理します。
throw new WebFaultException<string>(e.Message, HttpStatusCode.NotAcceptable);
これは、ストリームを使用して Post を実行する 1 つのシナリオを除いて、問題なく機能します。
この例:
[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 を閉じたり破棄したりせずに、アプリケーションにどのような影響を与えるのでしょうか? これを解決する他の方法はありますか?