1
votes

I am trying to create a custom JSONMediaTypeFormatter in which posts some json parameters to a webapi call. I need to encrypt the returned data from the webapi, hence writing a custom mediatypeformatter.

In my webapiconfig I clear all formatters and only add the custom formatter.

        config.Formatters.Clear();
        config.Formatters.Add(new CipherMediaFormatter());

In my custom media type formatter I add in the relevant headers and types but i still cant call my web api. It gives me an error

     No MediaTypeFormatter is available to read an object of type 'Param' from content with media type        'application/json

The code for the mediatypeformatter

public class CipherMediaFormatter : JsonMediaTypeFormatter
{
    private static Type _supportedType = typeof(object);

    public CipherMediaFormatter()
    {
        this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/octet-stream"));
        this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
        this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
    }

    public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
    {
        base.SetDefaultContentHeaders(type, headers, mediaType);
        headers.ContentType = new MediaTypeHeaderValue("application/json");
    }

    public override bool CanReadType(Type type)
    {
        return true;
    }

    public override bool CanWriteType(Type type)
    {
        return true;
    }

    public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
    {
        var taskSource = new TaskCompletionSource<object>();
        try
        {
            var ms = new MemoryStream();
            readStream.CopyTo(ms);
            taskSource.SetResult(ms.ToArray());
        }
        catch (Exception e)
        {
            taskSource.SetException(e);
        }
        return taskSource.Task;
    }

    public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
    {
        var taskSource = new TaskCompletionSource<object>();
        try
        {
            if (value != null)
            {
                var jsonData = JsonConvert.SerializeObject(value);
                ICryptographicService cgService = new CryptographicService();
                string apiKey = string.Empty;

                string pattern = @"api\/(.*)?\/(\d+)?";
                var match = Regex.Match(HttpContext.Current.Request.RawUrl, pattern);
               ....
            }
        }
        catch (Exception e)
        {
            taskSource.SetException(e);
        }
        return taskSource.Task;
    }
}
1

1 Answers

0
votes

The problem was ReadFromStreamAsync causing the mediatypeformatter to error.