5

私は Asp.NET WebApi を使用していますが、私を混乱させることの 1 つは、要求が完了したときのバインディングです。

私はこのViewModelを持っています:

[DataContract(Name="Store")]
public class StoreDm
{
    [DataMember(IsRequired = true)]
    [MinLength(3)]
    public string Name { get; set; }

    [DataMember(IsRequired = true)]
    public double Latitude { get; set; }

    [DataMember(IsRequired = true)]
    public double Longitude { get; set; }
}

public HttpResponseMessage GetStoreNames(StoreDm vm)
{
    if (ModelState.IsValid)
    {

    }
}

RestClient c = new RestClient("http://localhost:3333/api/store");
RestRequest r = new RestRequest("/GetStoreNames", Method.GET);
r.AddParameter("Name", autoComplete);
r.AddParameter("Latitude", "4");
r.AddParameter("Longitude", "-7");
var d =  c.BuildUri(r);
c.ExecuteAsync(r, response2 =>
  {
      var content = response2.Content;
  });

私の StoreDm は Null です。

私はこれをそれほど多くのレベルで理解していません。最初に、ModelState が「null」ViewModel が有効であると考える何らかの理由で、すべてのプロパティに IsRequired をセットアップします。

第二に、それがなぜなのかわかりませんnull[FromUri]バインドするには、追加する必要があります。Postこれがであり、同じ restClient コードを持っていて、誰かがフィドラー ボディ リクエストを使用している場合はどうなりますか。

強制的に配置する場合[FromUri]、フィドラー本体のリクエストは機能しないと思います。

両方のリクエストが通過して適切にバインドされるようにするにはどうすればよいですか?

4

1 に答える 1

11

Web API パラメーター バインディング (ここから抽出: Routing and Action Selection ) はこれを行います。

パラメータバインディング。パラメーター バインディングは、Web API がパラメーターの値を作成する方法です。パラメータバインディングのデフォルトのルールは次のとおりです。

  • 単純型は URI から取得されます。
  • 複合型はリクエスト本文から取得されます。

そのため、(クラスのようなStoreDm) 複合型は、既定では本体の一部であると想定されます。

標準定義Hypertext Transfer Protocol 4.3 Message Bodyに記載されているとおり

メッセージでメッセージ本文が許可される場合の規則は、要求と応答で異なります。

要求にメッセージ本文が存在することは、要求のメッセージ ヘッダーに Content-Length または Transfer-Encoding ヘッダー フィールドを含めることによって通知されます。リクエスト メソッドの仕様 (セクション 5.1.1) でエンティティ ボディの送信が許可されていない場合、リクエストにメッセージ ボディを含めてはなりません ( MUST NOT )。

そのため、Web API はいくつかの一般的な機能を提供しますが、一般的であるように努めています。メッセージ本文の有無にかかわらず、リクエストが存在する可能性があります。したがって、これを使用すると、「現在の」リクエスト固有の、おそらく明白な設定を推測することなく、アクションの選択とパラメーターのバインドが一般的になります(GET は常にURIにすべてのパラメーター (オブジェクトのプロパティ) を持つと考えられます.. StoreDm. しかし、エンジンはそうではありません)

POSTStoreDm、複雑なオブジェクトの標準バインディングである body にそのプロパティが含まれているため、すぐに使用できるようにバインドします。

GETはルールを破ります。(Complex 型の) プロパティは URI にあるため、フレームワークに通知する必要があるのは [FromUri] だけです。それ以外の場合は、メソッドが見つかり、null (メッセージ本文から制限) が渡されます。

于 2013-06-05T03:51:40.690 に答える