2016-04-14 27 views
1

を使用している場合、アクションparamerがnameパラメータは、ここで WEBAPIは - [FromBody]属性とPOSTメソッド

public class DeviceController : ApiController 
{ 
    [HttpPost] 
    public void Select([FromBody]string name) 
    { 
     //problem: name is always null 
    } 
} 

nullである理由を、私はこのコントローラを持っていると私は理解することはできませんnullである私のルートマッピングです:

私もプレーンな文字列に身体を変更しようとしました

POST http://localhost:9000/api/device/Select HTTP/1.2 
User-Agent: Fiddler 
Host: localhost:9000 
Content-Length: 16 
Content-Type: application/json 

{'name':'hello'} 

public void Configuration(IAppBuilder appBuilder) 
{ 
    HttpConfiguration config = new HttpConfiguration(); 
    config.Routes.MapHttpRoute(
     name: "ActionApi", 
     routeTemplate: "api/{controller}/{action}" 
    ); 

    appBuilder.UseWebApi(config); 
} 

、ここでは私の要求であるhello

POST http://localhost:9000/api/device/Select HTTP/1.2 
User-Agent: Fiddler 
Host: localhost:9000 
Content-Length: 5 
Content-Type: application/json 

hello 

要求は204に戻りますが、パラメータは決して投稿された値にマップされません。

*自己ホスティングサービスを使用しています。

答えて

2

最初の例では、[FromBody]属性がバインダーにシンプルタイプを検索するように指示したときに、複合オブジェクト{'name':'hello'}を使用していました。

それは引用符を読み取るためのWeb APIを強制するには、[FromBody]

を使用して"hello"

を行方不明になったように、第2の例では、体内でご提供された値が単純型として解釈することができませんでしたリクエストボディから単純型、パラメータに[FromBody]属性を追加:

public HttpResponseMessage Post([FromBody] string name) { ... } 

この例では、 Web APIは、メディアタイプのフォーマッターを使用して、要求本体からnameの値を読み取ります。クライアントリクエストの例を次に示します。

POST http://localhost:5076/api/values HTTP/1.1 
User-Agent: Fiddler 
Host: localhost:5076 
Content-Type: application/json 
Content-Length: 7 

"Alice" 

パラメータに[FromBody]がある場合、Web APIはContent-Typeヘッダーを使用してフォーマッタを選択します。この例では、コンテンツタイプは「application/json」で、リクエスト本文は未処理のJSON文字列です(JSONオブジェクトではありません)。

メッセージ本体から最大1つのパラメータを読み取ることができます。だから、これは動作しません。このルールの

// Caution: Will not work!  
public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... } 

理由は、リクエストボディは、一度しか読むことができない非バッファされたストリームに格納されるかもしれないということです。

ソース:Parameter Binding in ASP.NET Web API

+0

私はFromBodyパラメーターを持っています。違いは私がカスタムアクションを使用していることです – Liero

+0

サンプルリクエストを見て、リクエストと比較してください。あなたは '' hello ''のような**単純な型**とは対照的に、オブジェクト' {' name ':' hello '} 'を投稿していることに気づくでしょう。 – Nkosi

+1

私は私の質問を書いたので、私は引用符がない。私は '' hello''を代わりに投稿しました。 '' hello''です。解決策に至ったので、これを正しいasnwerとしてマークしますが、私が – Liero

関連する問題