it-swarm.com.ru

Нет MediaTypeFormatter, доступного для чтения объекта типа 'String' из содержимого с типом медиа 'text/plain'

Это ситуация:

Это внешний веб-сервис в Servoy и я хочу использовать этот сервис в ASP.NET MVC. 

С помощью этого кода я пытаюсь получить данные из сервиса:

HttpResponseMessage resp = client.GetAsync("http://localhost:8080/servoy-service/iTechWebService/axws/shop/_authenticate/mp/112818142456/82cf1988197027955a679467c309274c4b").Result;
resp.EnsureSuccessStatusCode();

var foo = resp.Content.ReadAsAsync<string>().Result;

но когда я запускаю приложение, я получаю следующую ошибку:

MediaTypeFormatter недоступен для чтения объекта типа String из контента с типом носителя 'text/plain'.

Если я открываю Fiddler и запускаю тот же URL-адрес, я вижу правильные данные, но тип содержимого - text/plain. Однако я вижу в Fiddler также JSON, который я хочу ...

Возможно ли решить это на стороне клиента или это веб-сервис Servoy?

Обновление:
Использовал HttpWebRequest вместо HttpResponseMessage и считывал ответ с помощью StreamReader ...

50
Renzzs

Попробуйте вместо этого использовать ReadAsStringAsync ().

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

Причина, по которой он ReadAsAsync<string>() не работает, заключается в том, что ReadAsAsync<> будет пытаться использовать один из стандартных MediaTypeFormatter (т.е. JsonMediaTypeFormatter, XmlMediaTypeFormatter, ...) для чтения содержимого с content-type из text/plain. Однако ни один из форматировщиков по умолчанию не может читать text/plain (они могут только читать application/json, application/xml и т.д.).

При использовании ReadAsStringAsync() содержимое будет читаться как строка независимо от типа содержимого.

71
Maggie Ying

Или вы можете просто создать свой собственный MediaTypeFormatter. Я использую это для text/html. Если вы добавите text/plain к нему, он будет работать и для вас:

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;
    }
}

Наконец, вы должны назначить это свойству HttpMethodContext.ResponseFormatter.

0
t3chb0t