ASP.NET Web APIはPOST純テキストフォーマット(text/plain)のデータをサポートする

2073 ワード

今日、web apiでこのような問題に遭遇しました.apiのパラメータタイプはstringですが、post bodyのjson形式のstringしか受信できず、元のstringは受信できません.
Web apiは、次のように定義されています.
public async Task<HttpResponseMessage> Post(string blogApp, int postId, [FromBody] string body)
{
}
json形式でweb apiにpostを行うことに成功しました.
var response = await _httpClient.PostAsJsonAsync(
    $"api/blogs/{blogApp}/posts/{postId}/comments",
    body);
しかし、純粋なテキストフォーマット(content-typeはtext/plain)postで、bodyの値は空です.
var response = await _httpClient.PostAsync(
    $"api/blogs/{blogApp}/posts/{postId}/comments",
    new StringContent(body)
    );
研究の結果、これはcontent-typeがtext/plainであるpost要求に対してasp.Netweb apiは対応するMediaType Formatter,aspを提供していない.Netweb apiのデフォルトはJsonMediaType FormatterとXmlMediaType Formatterのみです.
この問題を解決するには、PlainTextType Formatterを実装する必要があります.実装コードは次のとおりです.
public class PlainTextTypeFormatter : MediaTypeFormatter
{
    public PlainTextTypeFormatter()
    {
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain"));
    }

    public override bool CanReadType(Type type)
    {
        return type == typeof(string);
    }

    public override bool CanWriteType(Type type)
    {
        return type == typeof(string);
    }

    public override async Task WriteToStreamAsync(Type type, object value, 
        Stream writeStream, HttpContent content, TransportContext transportContext)
    {
        using (var sw = new StreamWriter(writeStream))
        {
            await sw.WriteAsync(value.ToString());
        }              
    }

    public override async Task<object> ReadFromStreamAsync(Type type, Stream readStream, 
        HttpContent content, IFormatterLogger formatterLogger)
    {
        using (var sr = new StreamReader(readStream))
        {
            return await sr.ReadToEndAsync();
        }
    }
}
上記の実装コードでは,本明細書の問題を解決するにはCanReadType()とReadFromStreamAsync()を実装するだけである.CanWriteType()とReadFromStreamAsync()の実装は、別の問題を解決するためであり、詳細は、ASP.NET Web APIはtext/plainコンテンツ交渉をサポートする.