C#
 Computer >> コンピューター >  >> プログラミング >> C#

Asp.Net WebAPI C#でMIMEタイプを指定するにはどうすればよいですか?


メディアタイプは、MIMEタイプとも呼ばれ、データの形式を識別します。 HTTPでは、メディアタイプはメッセージ本文の形式を記述します。メディアタイプは、タイプとサブタイプの2つの文字列で構成されます。例-

  • text / html
  • image / png
  • application / json

HTTPメッセージにentity-bodyが含まれている場合、Content-Typeヘッダーはメッセージ本文の形式を指定します。これは、メッセージ本文の内容を解析する方法を受信者に指示します。

クライアントが要求メッセージを送信するとき、Acceptヘッダーを含めることができます。 Acceptヘッダーは、クライアントがサーバーに要求するメディアタイプをサーバーに通知します。

承認:text / html、application / xhtml + xml、application / xml

メディアタイプは、WebAPIがHTTPメッセージ本文をシリアル化および逆シリアル化する方法を決定します。 Web APIには、XML、JSON、BSON、およびformurlencodedデータのサポートが組み込まれており、メディアフォーマッターを作成することで追加のメディアタイプをサポートできます。

MediaTypeFormatterは、JsonMediaTypeFormatterクラスとXmlMediaTypeFormatterクラスが継承する抽象クラスです。 JsonMediaTypeFormatterはJSONを処理し、XmlMediaTypeFormatterはXMLを処理します。メディアタイプは、WebApiConfigクラスのRegisterメソッドで指定されます。メディアタイプを試してみることができるいくつかの例を見てみましょう。

学生コントローラー

using DemoWebApplication.Models;
using DemoWebApplication.Models;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace DemoWebApplication.Controllers{
   public class StudentController : ApiController{
      List <Student> students = new List <Student>{
         new Student{
            Id = 1,
            Name = "Mark"
         },
         new Student{
            Id = 2,
            Name = "John"
         }
      };
      public IEnumerable <Student> Get(){
         return students;
      }
   }
}

Acceptヘッダー値に関係なく、ASP.NETWebAPIサービスからJSONのみを返す例-

public static class WebApiConfig{
   public static void Register(HttpConfiguration config){
      config.MapHttpAttributeRoutes();
      config.Formatters.Remove(config.Formatters.XmlFormatter);
      config.Routes.MapHttpRoute(
         name: "DefaultApi",
         routeTemplate: "api/{controller}/{id}",
         defaults: new { id = RouteParameter.Optional }
      );
   }
}

上記のコードを使用して、クライアント要求のAcceptヘッダー値に関係なくASP.NETWebAPIが常にJSONを返すように強制するXmlFormatterを削除しました。サービスでXMLではなくJSONのみをサポートする場合は、この手法を使用してください。

Asp.Net WebAPI C#でMIMEタイプを指定するにはどうすればよいですか?

上記の出力から、Acceptヘッダー値application / xmlに関係なく、WebAPIサービスは常にJSONを返します。

Acceptヘッダー値に関係なく、ASP.NETWebAPIサービスからXMLのみを返す例-

public static class WebApiConfig{
   public static void Register(HttpConfiguration config){
      config.MapHttpAttributeRoutes();
      config.Formatters.Remove(config.Formatters.JsonFormatter);
      config.Routes.MapHttpRoute(
         name: "DefaultApi",
         routeTemplate: "api/{controller}/{id}",
         defaults: new { id = RouteParameter.Optional }
      );
   }
}

Asp.Net WebAPI C#でMIMEタイプを指定するにはどうすればよいですか?

上記の出力から、Acceptヘッダー値application / jsonに関係なく、WebAPIサービスがXMLを返していることがわかります。

ブラウザからリクエストが行われたときにASP.NETWebAPIサービスからXMLではなくJSONを返す例-

ブラウザからStudentControllerにリクエストが送信されると、応答はXML形式になります。これは、ブラウザがデフォルトでacceptヘッダーをtext/htmlとして送信するためです。

Asp.Net WebAPI C#でMIMEタイプを指定するにはどうすればよいですか?

次に、リクエストがブラウザから発行されたときにXMLではなくJSONレスポンスを送信する方法を見てみましょう。

public static class WebApiConfig{
   public static void Register(HttpConfiguration config){
      config.MapHttpAttributeRoutes();
      config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new
      MediaTypeHeaderValue("text/html"));
      config.Routes.MapHttpRoute(
         name: "DefaultApi",
         routeTemplate: "api/{controller}/{id}",
         defaults: new { id = RouteParameter.Optional }
      );
   }
}

以下の出力は、acceptヘッダーtext / htmlに関係なく、リクエストがブラウザから起動されたときの応答がJSONタイプであることを示しています。

Asp.Net WebAPI C#でMIMEタイプを指定するにはどうすればよいですか?


  1. C#ASP.NET WebAPIでCORSの問題を解決するにはどうすればよいですか?

    クロスオリジンリソースシェアリング (CORS)は、追加のHTTPヘッダーを使用して、あるオリジンで実行されているWebアプリケーションに、別のオリジンから選択されたリソースへのアクセスを許可するようにブラウザーに指示するメカニズムです。 Webアプリケーションは、自身とは異なるオリジン(ドメイン、プロトコル、またはポート)を持つリソースを要求すると、クロスオリジンHTTPリクエストを実行します。 たとえば、フロントエンド(UI)とバックエンド(サービス)を持つアプリケーションについて考えてみましょう。フロントエンドがhttps://demodomain-ui.comから提供されているとしま

  2. C#ASP.NET WebAPIのアクションメソッドからカスタム結果タイプを返す方法は?

    IHttpActionResultインターフェイスを実装することで、結果タイプとして独自のカスタムクラスを作成できます。 。 IHttpActionResultには、HttpResponseMessageインスタンスを非同期的に作成する単一のメソッドExecuteAsyncが含まれています。 public interface IHttpActionResult {    Task<HttpResponseMessage> ExecuteAsync(CancellationToken    cancellationToken); } コントロ