場合によっては、MediaTypeFormatter を手動で選択したいことがあります。これを行う方法はありますか?
たとえば、ユーザー エージェントが Opera の場合、常に JSON 形式でデータを返します
場合によっては、MediaTypeFormatter を手動で選択したいことがあります。これを行う方法はありますか?
たとえば、ユーザー エージェントが Opera の場合、常に JSON 形式でデータを返します
もちろん、カスタム 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 に関連する私の古いブログ投稿 ( 1、2 ) からの詳細情報:
複数のフォーマッタが受信リクエストの基準に一致するとどうなりますか? Conneg アルゴリズムはどれを選択しますか?
Conneg アルゴリズムの実行中、Request Accept ヘッダー、Content-Type ヘッダー、MediaTypeMapping などの一連の基準に基づいて、複数のフォーマッターが応答の書き込みでその可用性を示す可能性が常にあります。ご想像のとおり、Conneg アルゴリズムは最終的にフォーマッタを 1 つだけ選択する必要があります。デフォルトの Conneg アルゴリズムには、最終的なフォーマッタを選択するための次の優先順位があります。