2

Web API アクション メソッドがアクション パラメーターとして受け入れる DataContract があります。

public HttpResponseMessage PostMyObject(MyObjectRequestDc objRequest){ ... }

[DataContract]
public class MyObjectRequestDc
{
    public MyObjectRequestDc()
    {
        References = new List<Uri>();
    }
    [DataMember]
    public List<Uri> References { get; set; }
}

コントラクトのプロパティの 1 つは、URI オブジェクト (「参照」) のリストです。

クライアントが正しい URI に解決されない文字列を含むリクエストを送信した場合、フレームワーク コードの奥深くで例外がスローされます (指定された文字列から URI クラスをインスタンス化できないため)。

JSON 入力の例:

{ "参照": [ "これは有効な uri ではありません。" ] }

例外の詳細/スタック トレース

Error details: System.InvalidOperationException: This operation is not supported for a relative URI.
at System.Uri.get_AbsolutePath()
at GetAbsolutePathFromUri(Object )
at System.Web.Http.Metadata.Providers.AssociatedMetadataProvider`1.<>c__DisplayClass3.<GetMetadataForPropertiesImpl>b__0()
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata, ValidationContext validationContext)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateElements(IEnumerable model, ValidationContext validationContext)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata, ValidationContext validationContext)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container)
at System.Web.Http.ModelBinding.FormatterParameterBinding.<>c__DisplayClass1.<ExecuteBindingAsync>b__0(Object model)
at System.Threading.Tasks.TaskHelpersExtensions.<>c__DisplayClass49.<ToAsyncVoidTask>b__48()
at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)

要件は、ユーザーにコード 400 (BadRequest) の応答と、「参照された URI 'xxx' は無効です」という行に沿ったメッセージが返されることです。

現時点では、GlobalExceptionFilter によって例外がキャッチされ、役に立たない 500 が返されます。

理想的には、このシナリオがモデル状態エラーまたは応答を制御できるその他のメカニズムとしてキャプチャされることを望みます。

私が検討したオプション: 1. カスタム HttpParameterBinding クラスを作成し、そこで例外を処理しますか? 2. References プロパティを String オブジェクトのリストに変更し、コントローラのアクション メソッド内で URI クラスのインスタンス化を処理します 3. GlobalExceptionFilter で明示的に例外をキャッチし、ここから応答を調整します (これにはランク コードがあります)臭いけど…)

提案は大歓迎です!!!

4

2 に答える 2

1

問題に対する答えがないように見えることを考えると、私が採用しようとしている回避策は、私の 2 番目のオプションです。

References プロパティを String オブジェクトのリストに変更し、コントローラーのアクション メソッド内で URI クラスのインスタンス化を処理します。

そして、URIのインスタンス化中に発生する例外を自分で処理します...

于 2013-07-01T10:31:06.103 に答える