#StackBounty: #c# #asp.net-web-api #asp.net-web-api2 #odata #asp.net-web-api-odata Web API OData – ODataMediaTypeFormatter MediaTypeRes…

Bounty: 500

Web API OData v7. I’m writing a custom formatter for CSV, Excel, etc. I have a disconnect of how I point my custom formatter (ODataMediaTypeFormatter) to my custom classes where I modify the output.

CustomFormatter : ODataMediaTypeFormatter – had a MessageWriterSettings.MediaTypeResolver which no longer exists in v. 7

When I debug, I get to the GetPerRequestFormatterInstance, and after that it dies with A supported MIME type could not be found that matches the content type of the response.

I can’t figure out the flow–how to tie it to my custom (ODataWriter) writer (csv, or whatever I wish to create).

For instance, from the example on 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..
}

The disconnect is with ODataMediaTypeFormatter and CsvMediaTypeResolver. How do I link the ODataMediaTypeFormatter to my resolver?


Get this bounty!!!

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.