0

場合によっては、MediaTypeFormatter を手動で選択したいことがあります。これを行う方法はありますか?

たとえば、ユーザー エージェントが Opera の場合、常に JSON 形式でデータを返します

4

1 に答える 1

1

もちろん、カスタム MediaTypeMapping を作成してフォーマッタに追加することもできます。

以下の例:

config.Formatters.JsonFormatter.MediaTypeMappings.Add(new UserAgentMediaTypeMapping("Chrome", "application/json"));

-----------------------------------------------------

public class UserAgentMediaTypeMapping : MediaTypeMapping
{
    private string _userAgent;

    public UserAgentMediaTypeMapping(string userAgent, string mediaType)
        : base(mediaType)
    {
        //todo: error check

        _userAgent = userAgent.ToLowerInvariant();
    }

    public UserAgentMediaTypeMapping(string userAgent, MediaTypeHeaderValue mediaType)
        : base(mediaType)
    {
        //todo: error check

        _userAgent = userAgent.ToLowerInvariant();
    }

    public string UserAgent 
    {
        get
        {
            return _userAgent;
        }
    }

    public override double TryMatchMediaType(HttpRequestMessage request)
    {
        HttpHeaderValueCollection<ProductInfoHeaderValue> agents = request.Headers.UserAgent;

        foreach (ProductInfoHeaderValue pihv in agents)
        {
            if (pihv.Product != null)
            {
                if (pihv.Product.Name.ToLowerInvariant() == UserAgent)
                {
                    return 1.0;
                }
            }
        }

        return 0.0;
    }
}

con-neg に関連する私の古いブログ投稿 ( 12 ) からの詳細情報:

複数のフォーマッタが受信リクエストの基準に一致するとどうなりますか? Conneg アルゴリズムはどれを選択しますか?

Conneg アルゴリズムの実行中、Request Accept ヘッダー、Content-Type ヘッダー、MediaTypeMapping などの一連の基準に基づいて、複数のフォーマッターが応答の書き込みでその可用性を示す可能性が常にあります。ご想像のとおり、Conneg アルゴリズムは最終的にフォーマッタを 1 つだけ選択する必要があります。デフォルトの Conneg アルゴリズムには、最終的なフォーマッタを選択するための次の優先順位があります。

  1. メディア タイプ マッピングに基づくフォーマッタの一致。
  2. Request Accept ヘッダーのメディア タイプに基づくフォーマッターの一致。
  3. Request Content-Type ヘッダーのメディア タイプに基づくフォーマッターの一致。
  4. 応答データの Type をシリアル化できるかどうかに基づくフォーマッターの一致。
于 2013-04-26T18:02:14.877 に答える