2013-07-31 8 views
5

MediaTypeFormatter.ReadFromStreamAsync bir eylem Parametre alın değişen türlere istek gövdesi., uygulama biçimlendirmeliyim ben "ad" parametresine bağlı olarak özel bir <code>MediaTypeFormatter</code></p> <p>ile kendi kendine barındırılan WebAPI uygulamaya sahip (Ya URL böylece parçası) istenen URL'yi Veya ben

İşte Burada eylemi

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

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

var gelenek 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); 
    } 
} 

cevap

4

Burada yapabilirsiniz tek yoludur. Bir mesaj işleyici, isteği okuyun ve bunun gibi bir içerik başlığı ekleyin.

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); 
    } 
} 

Sonra ReadFromStreamAsync içindeki biçimlendiriciden bu başlığı okuyabilir.

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

bu iyi bir çözüm oldu –

İlgili konular