OData веб-API - ODataMediaTypeFormatter MediaTypeResolver больше не существует - PullRequest
0 голосов
/ 11 января 2019

Веб API OData v7. Я пишу пользовательский форматтер для CSV, Excel и т. Д. У меня нет связи с тем, как я указываю свой пользовательский форматер (ODataMediaTypeFormatter) на мои пользовательские классы, где я изменяю вывод.

Пользовательский формат: ODataMediaTypeFormatter - имел MessageWriterSettings.MediaTypeResolver, которого больше не существует в v. 7

Когда я отлаживаюсь, я попадаю в GetPerRequestFormatterInstance, и после этого он умирает с поддерживаемым типом MIME, который не может быть найден, который соответствует типу содержимого ответа.

Я не могу понять поток - как связать его с моим пользовательским (ODataWriter) писателем (CSV, или что я хочу создать).

Например, из примера на git:

public class CustomFormatter : ODataMediaTypeFormatter
{
    private readonly string csvMime = ;

    public CustomFormatter(params ODataPayloadKind[] kinds)
        : base(kinds) {
        //----no longer exists in 7
        //MessageWriterSettings.MediaTypeResolver = new MixResolver();

        SupportedEncodings.Add(Encoding.UTF8);
        SupportedEncodings.Add(new UTF8Encoding(encoderShouldEmitUTF8Identifier: false));
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/csv"));            
    }
}

public class MixResolver : ODataMediaTypeResolver
{
    public override IEnumerable<ODataMediaTypeFormat> GetMediaTypeFormats(ODataPayloadKind payloadKind)
    {
        if (payloadKind == ODataPayloadKind.Resource || payloadKind == ODataPayloadKind.ResourceSet)
        {
            return CsvMediaTypeResolver.Instance.GetMediaTypeFormats(payloadKind);
        }
        return base.GetMediaTypeFormats(payloadKind);
    }
}

public class CsvMediaTypeResolver : ODataMediaTypeResolver
{
    private static readonly CsvMediaTypeResolver instance = new CsvMediaTypeResolver();
    private readonly ODataMediaTypeFormat[] mediaTypeFormats =
    {
    new ODataMediaTypeFormat(new ODataMediaType("text", "csv"), new CsvFormat())
};

public class CsvMediaTypeResolver : ODataMediaTypeResolver
{
    private static readonly CsvMediaTypeResolver instance = new CsvMediaTypeResolver();
    private readonly ODataMediaTypeFormat[] mediaTypeFormats = { new ODataMediaTypeFormat(new ODataMediaType("text", "csv"), new CsvFormat())};
    private CsvMediaTypeResolver() { }
    public static CsvMediaTypeResolver Instance { get { return instance; } }
    public override IEnumerable<ODataMediaTypeFormat> GetMediaTypeFormats(ODataPayloadKind payloadKind)
    {
        if (payloadKind == ODataPayloadKind.Resource || payloadKind == ODataPayloadKind.ResourceSet)
        {
            return mediaTypeFormats.Concat(base.GetMediaTypeFormats(payloadKind));
        }
        return base.GetMediaTypeFormats(payloadKind);
    }
}


public class CsvWriter : ODataWriter
{
    // Etc..
}

Отключение происходит с ODataMediaTypeFormatter и CsvMediaTypeResolver. Как связать ODataMediaTypeFormatter с моим распознавателем?

...