ASP.NET Web APIはtext/plainコンテンツ協議をサポートする

1627 ワード

ASP.NET Web APIのContent Negotiationメカニズムの理想的な状況は、クライアントが要求ヘッダのAcceptフィールドにどのようなMIMEタイプを指定するか、Web APIサービス側が対応するMIMEタイプのコンテンツを返すことである(応答ヘッダの中Content-TypeはAcceptで指定されたMIMEタイプである).
現実的には、Web APIサービス側がどのようなMIMEタイプの応答タイプを返すことができるかは、このMIMEタイプに対応するMediaType Formatterがあるかどうかにかかっている.ASP.NET Web APIのデフォルト実装では、2種類のMediaType Formatter(私が使用しているWeb APIバージョンは5.2)しか提供されていません.XmlMediaType FormatterとJsonMediaType Formatterです.したがって、要求ヘッダのAcceptでアプリケーション/xmlまたはアプリケーション/jsonとして指定しない限り、他の任意のMIMEを指定すると、Web APIはアプリケーション/json(デフォルトの応答タイプ)を返します.
今日ではこの現実に半日振り回され、acceptではtext/plainを指定し、Web APIは常にjson形式のデータを返します.その後、ネットワークを通じてパッケージをつかんでやっとこの問題を発見した.本当にASPがわかりません.NET Web APIはなぜPlainTextType Formatterをデフォルトで実装しないのか.
仕方なく、PlainTextType Formatterを自分で実現するしかありません.
  • MediaType Formatter
  • を継承
  • コンストラクタにMediaTypeHeaderValue(「text/plain」)
  • を追加
  • リロードの3つの方法:CanReadType(),CanWriteType()およびWriteToStreamAsync()
  • 完全な実装コードは次のとおりです.
    public class PlainTextTypeFormatter : MediaTypeFormatter
    {
        public PlainTextTypeFormatter()
        {
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain"));
        }
    
        public override bool CanReadType(Type type)
        {
            return false;
        }
    
        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());
            }              
        }
    }