2013-07-31 15 views
5

をMediaTypeFormatter.ReadFromStreamAsyncアクションパラメータを取得し、アプリケーションをフォーマットする必要がありますさまざまな種類のリクエストボディ。ここで私は「名前」パラメータ(または、それによって、URLの一部)に応じて、カスタム<code>MediaTypeFormatter</code></p> <p>と自己ホストWEBAPIアプリケーションを持っている要求されたURLまたは私は

アクションが

// http://localhost/api/fire/test/ 
// Route: "api/fire/{name}", 

public HttpResponseMessage Post([FromUri] string name, object data) 
{ 
    // Snip 
} 

です。ここここMediaTypeFormatter.ReadFromStreamAsync

public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger) 
{ 
    var name = "test"; // TODO this should come from the current request 

    var formatter = _httpSelfHostConfiguration.Formatters.JsonFormatter; 

    if (name.Equals("test", StringComparison.InvariantCultureIgnoreCase)) 
    { 
     return formatter.ReadFromStreamAsync(typeof(SomeType), readStream, content, formatterLogger); 
    } 
    else 
    { 
     return formatter.ReadFromStreamAsync(typeof(OtherType), readStream, content, formatterLogger); 
    } 
} 

答えて

4

は、あなたがこれを行うことができます一つの方法であるカスタムです。メッセージハンドラに要求を読み込ませ、このようなコンテンツヘッダーを追加させる。

public class TypeDecidingHandler : DelegatingHandler 
{ 
    protected override async Task<HttpResponseMessage> SendAsync(
       HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     // Inspect the request here and determine the type to be used 
     request.Content.Headers.Add("X-Type", "SomeType"); 

     return await base.SendAsync(request, cancellationToken); 
    } 
} 

次に、ReadFromStreamAsync内のフォーマッタからこのヘッダーを読み取ることができます。

public override Task<object> ReadFromStreamAsync(
          Type type, Stream readStream, 
            HttpContent content, 
             IFormatterLogger formatterLogger) 
{ 
    string typeName = content.Headers.GetValues("X-Type").First(); 

    // rest of the code based on typeName 
} 
+0

ありがとうございました。 –

関連する問題

 関連する問題