WCF RESTメソッドからカスタムHTTPステータスコードを返すにはどうすればよいですか?


88

要求されたリソースが見つからないなど、WCF REST呼び出しで問題が発生した場合、OperationContractメソッドでHTTP応答コード(HTTP 404などに設定する)をどのように操作できますか?


これに対するすべての答えは、コントロールがサービスの実装に組み込んだと想定しています。完全に無効なURIを渡した場合はどうなりますか?サービスへの予期しないヒットすべてに404を提供するにはどうすればよいですか?
Nathan Tregillus

回答:


111

ありWebOperationContextあなたがアクセスすることができ、それが持っているOutgoingResponseタイプのプロパティOutgoingWebResponseContextがあるStatusCode設定することができますプロパティを。

WebOperationContext ctx = WebOperationContext.Current;
ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;

5
これはWCF Data Services-Service Operations内で機能しますか?運が良かったのですが、設定したStatusCodeが何か他のものに負けてしまったようです。したがって、すべてのHTTP POSTリクエストで、201に設定したかどうかに関係なく、204が返されます。
RyBolt 2010

1
私の場合は機能しません。ステータスが上書きされます。WebFaultExceptionただし、をスローしても機能するようです。
Josh M. 14

73

理由本文を返す必要がある場合は、WebFaultExceptionを確認してください

例えば

throw new WebFaultException<string>("Bar wasn't Foo'd", HttpStatusCode.BadRequest );

4
私たちは、静的のWebOperationContext.Currentを使用していないので、受け入れられたものよりも、この方が好きI
ノエル・エイブラハムズ


うーん、.NET 4.5.1では、これはステータスコードを設定していません。まだ200を取得しています。jsonpを使用しています。コールバック(JavaScript)を呼び出し、メッセージとステータスコードを整数。
Shavais 14年

4
これは2XXコード以外の場合に最適ですが、をスローしWebFaultExceptionHttpStatusCode.Created
2014年

23

404のためのメソッドに内蔵あるWebOperationContext.Current.OutgoingResponse呼ばSetStatusAsNotFound(ストリングメッセージ) 404にステータスコードと一つの呼び出しとステータスの説明を設定します。

ステータスコードを201に設定し、1回の呼び出しでロケーションヘッダーを設定するSetStatusAsCreated(Uri location)もあることに注意してください。


これは、承認された回答に表示される方法よりも優先されますか?
2014年

2

ヘッダーにステータスの説明を表示したい場合、RESTメソッドは次のようにCatch()セクションから必ずnullを返す必要があります。

catch (ArgumentException ex)
{
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
    WebOperationContext.Current.OutgoingResponse.StatusDescription = ex.Message;
    return null;
}

1
これも私にとってはうまくいきませんでした。それでも200を取得します。crossDomainScriptAccessEnabled= "true"でWebHttpBindingを使用し、デフォルトのボディスタイルがラップされ、デフォルトの発信応答形式がjsonのwebHttpのエンドポイント動作を使用しています。しかし、それは問題ではありませんか?
Shavais 14年



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.