No MediaTypeFormatter is available to read an object of type 'String' from content with media type 'text/plain'

前端 未结 3 1701
一整个雨季
一整个雨季 2020-12-29 19:08

This is the situation:

Their is a external webservice in Servoy and I want to use this service in a ASP.NET MVC applicatie.

With this code I attempt to get the

相关标签:
3条回答
  • 2020-12-29 19:47

    I know this is an older question, but I felt the answer from t3chb0t led me to the best path and felt like sharing. You don't even need to go so far as implementing all the formatter's methods. I did the following for the content-type "application/vnd.api+json" being returned by an API I was using:

    public class VndApiJsonMediaTypeFormatter : JsonMediaTypeFormatter
    {
        public VndApiJsonMediaTypeFormatter()
        {
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/vnd.api+json"));
        }
    }
    

    Which can be used simply like the following:

    HttpClient httpClient = new HttpClient("http://api.someaddress.com/");
    HttpResponseMessage response = await httpClient.GetAsync("person");
    
    List<System.Net.Http.Formatting.MediaTypeFormatter> formatters = new List<System.Net.Http.Formatting.MediaTypeFormatter>();
    formatters.Add(new System.Net.Http.Formatting.JsonMediaTypeFormatter());
    formatters.Add(new VndApiJsonMediaTypeFormatter());
    
    var responseObject = await response.Content.ReadAsAsync<Person>(formatters);
    

    Super simple and works exactly as I expected.

    0 讨论(0)
  • 2020-12-29 19:58

    Try using ReadAsStringAsync() instead.

     var foo = resp.Content.ReadAsStringAsync().Result;
    

    The reason why it ReadAsAsync<string>() doesn't work is because ReadAsAsync<> will try to use one of the default MediaTypeFormatter (i.e. JsonMediaTypeFormatter, XmlMediaTypeFormatter, ...) to read the content with content-type of text/plain. However, none of the default formatter can read the text/plain (they can only read application/json, application/xml, etc).

    By using ReadAsStringAsync(), the content will be read as string regardless of the content-type.

    0 讨论(0)
  • 2020-12-29 20:08

    Or you can just create your own MediaTypeFormatter. I use this for text/html. If you add text/plain to it, it'll work for you too:

    public class TextMediaTypeFormatter : MediaTypeFormatter
    {
        public TextMediaTypeFormatter()
        {
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
        }
    
        public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
        {
            return ReadFromStreamAsync(type, readStream, content, formatterLogger, CancellationToken.None);
        }
    
        public override async Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger, CancellationToken cancellationToken)
        {
            using (var streamReader = new StreamReader(readStream))
            {
                return await streamReader.ReadToEndAsync();
            }
        }
    
        public override bool CanReadType(Type type)
        {
            return type == typeof(string);
        }
    
        public override bool CanWriteType(Type type)
        {
            return false;
        }
    }
    

    Finally you have to assign this to the HttpMethodContext.ResponseFormatter property.

    0 讨论(0)
提交回复
热议问题