5

カスタムの自己ホスト WebApi アプリケーションがあります。MediaTypeFormatter

「name」パラメーター (または 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

1 に答える 1

4

これを行う方法の 1 つを次に示します。メッセージ ハンドラーにリクエストを読み取らせ、このようなコンテンツ ヘッダーを追加します。

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
}
于 2013-07-31T06:52:08.627 に答える