HTTP ステータス コードを WebFaultExceptions として返す WCF REST プロジェクトがあります。これは GET 呼び出しではうまく機能しますが、POST 呼び出しで WebFaultException が返されるのに問題があります。リクエスト本文のデータは、コンテンツ タイプを「application/x-www-form-urlencoded;charset=utf-8」として使用しています。問題は、コンテキストが using 句から切り替えられて WebFaultException がスローされると、基になる要求ストリームが閉じられることだと思います。
「using」句の前に WebFaultException をスローすると、期待どおりに例外が返されます。「using」句内から WebFaultException をスローすると、例外はクライアントに返されません。
ストリームリーダーを使用してリクエスト本文を読み取るときに WebFaultException を正常にスローできるようにする方法について、誰か提案はありますか?
これは、私のサーバー側コードの短縮版です。この例の httpstatuscodes は、実際の実装には現実的ではないことに注意してください。
[WebInvoke(Method = "POST"
, UriTemplate = "urls/{id}"
, BodyStyle = WebMessageBodyStyle.WrappedRequest
)]
public string PostItem(string id, object streamdata)
{
int _id = 0;
if (int.TryParse(companyIdSr2, out _id))
{
using (System.IO.StreamReader reader = new System.IO.StreamReader(streamdata))
{
string body = reader.ReadToEnd();
if(string.IsNullOrEmpty(body))
{
// this exception doesn't make it back to the client's request object
ThrowError(HttpStatusCode.BadRequest, "empty body");
}
}
}
else
{
// this exception is successfully returned to the client's request object
ThrowError(HttpStatusCode.BadRequest, "invalid id");
}
}
private static void ThrowError(HttpStatusCode status, string message)
{
request_error error = new request_error
{
request_url = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri.OriginalString,
error_status_code = status.ToString(),
error_message = message,
};
throw new WebFaultException<request_error>(error, status);
}
public class request_error
{
[XmlElement("request_url")]
public string request_url { get; set; }
[XmlElement("error_status_code")]
public string error_status_code { get; set; }
[XmlElement("error_message")]
public string error_message { get; set; }
}
私はこの質問を見てきました -ストリームを使用してストリームを閉じるときの間違った WebFaultException - そして、問題にいくらか対処しますが、ストリームを破棄または閉じないことが合理的かどうかは未回答のままです。
どうもありがとう、
テリー