进行内容协商时未使用SupportedMediaTypes

本文关键字:未使用 SupportedMediaTypes 内容协商 | 更新日期: 2023-09-27 18:21:07

我创建了一个新的格式化程序来处理内容协商。

public TiffImageFormatter()
{
    SupportedMediaTypes.Add(new MediaTypeHeaderValue("image/tiff"));
}
public override bool CanReadType(Type type)
{
    return type == typeof(byte[]);
}
public override bool CanWriteType(Type type)
{
    return type == typeof(byte[]);
}

但是当运行时

var negotiator = Configuration.Services.GetContentNegotiator();
var type = negotiator.Negotiate(typeof(byte[]), Request, Configuration.Formatters);

不考虑支持的媒体类型,而是"CanWritetype"是决定使用哪种接受类型的唯一条件。

接受:image/*、image/png、image/tiff、*/*应该会产生image/tiff,但是Accept:image/png应返回null,允许我发送不可接受的内容。

如何确定哪种媒体类型正确?

进行内容协商时未使用SupportedMediaTypes

您需要使用MediaTypeFormatter.MediaTypeMappings并添加相关的Accept标头:

public TiffImageFormatter()
{
    SupportedMediaTypes.Add(new MediaTypeHeaderValue("image/tiff"));
    MediaTypeMappings.Add(
                new RequestHeaderMapping("Accept", "image'tiff", 
                                          StringComparison.OrdinalIgnoreCase,
                                          false, "image'tiff"));
}

如果您需要任何进一步的信息,这篇博客文章将解释媒体类型匹配的算法。