ASP.NET Web API(C#)でMIMEタイプを指定する方法を徹底解説
メディアタイプ(MIMEタイプとも呼ばれます)は、データの形式を識別するためのものです。HTTPにおいて、メディアタイプはメッセージ本文(ボディ)の形式を表します。メディアタイプは「タイプ」と「サブタイプ」という2つの文字列で構成されます。例えば以下のようなものがあります。
- text/html
- image/png
- application/json
Content-TypeヘッダーとAcceptヘッダーの役割
HTTPメッセージにエンティティボディが含まれる場合、Content-Typeヘッダーがメッセージ本文の形式を指定します。これにより、受信側はメッセージボディの内容をどのように解析すればよいのかを知ることができます。
一方、クライアントがリクエストメッセージを送信する際には、Acceptヘッダーを含めることができます。Acceptヘッダーは、クライアントがサーバーに対してどのメディアタイプを希望しているかを伝える役割を持ちます。
Accept: text/html,application/xhtml+xml,application/xml
Web APIにおけるメディアタイプとフォーマッター
メディアタイプは、Web APIがHTTPメッセージボディをシリアライズ・デシリアライズする方法を決定します。Web APIにはXML、JSON、BSON、form-urlencodedデータのサポートが組み込まれており、独自のメディアフォーマッターを作成することで、追加のメディアタイプにも対応できます。
MediaTypeFormatterは抽象クラスであり、そこからJsonMediaTypeFormatterクラスとXmlMediaTypeFormatterクラスが継承されています。JsonMediaTypeFormatterはJSONを、XmlMediaTypeFormatterはXMLを処理します。メディアタイプは、WebApiConfigクラスのRegisterメソッド内で指定します。
それでは、メディアタイプを操作できる具体的な例をいくつか見ていきましょう。
Studentコントローラーの準備
まず、サンプルとして使用するStudentコントローラーを定義します。
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;
}
}
}例1:Acceptヘッダーの値に関わらず、常にJSONのみを返す
XmlFormatterを削除することで、クライアントからのAcceptヘッダーの値に関係なく、ASP.NET Web APIに常に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 }
);
}
}この手法は、サービスでXMLではなくJSONのみをサポートしたい場合に有効です。上記のコードではXmlFormatterを削除しているため、クライアントがAcceptヘッダーでapplication/xmlを指定しても、Web APIサービスは常にJSONを返します。
例2:Acceptヘッダーの値に関わらず、常にXMLのみを返す
逆に、JsonFormatterを削除すると、常に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 }
);
}
}この設定では、クライアントがAcceptヘッダーでapplication/jsonを指定していても、Web APIサービスはXMLを返します。
例3:ブラウザからのリクエスト時に、XMLの代わりにJSONを返す
ブラウザからStudentControllerへリクエストを送ると、レスポンスはXML形式になります。これは、ブラウザがデフォルトでAcceptヘッダーとしてtext/htmlを送信するためです。
では、ブラウザからリクエストされた場合でも、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 }
);
}
}このコードでは、JsonFormatterのSupportedMediaTypesに"text/html"を追加しています。これにより、ブラウザからAcceptヘッダーtext/html付きでリクエストが送られてきた場合でも、レスポンスはJSON形式で返されるようになります。
まとめ
ASP.NET Web APIでは、WebApiConfigクラスのRegisterメソッド内でフォーマッターを操作することにより、レスポンスの形式(MIMEタイプ)を柔軟に制御できます。XmlFormatterやJsonFormatterの削除、あるいはSupportedMediaTypesへの追加といったシンプルなテクニックを活用すれば、APIの利用シーンに合わせた最適なレスポンス形式を提供できるでしょう。
-
C# ASP.NET WebAPIでCORSの問題を解決する方法を徹底解説
CORS(クロスオリジンリソースシェアリング)とはクロスオリジンリソースシェアリング(Cross-Origin Resource Sharing:CORS)は、追加のHTTPヘッダーを使用して、あるオリジンで動作しているWebアプリケーションに対し、別のオリジンにある選択されたリソースへのアクセスを許可するようブラウザに指示する仕組みです。Webアプリケーションは、自身とは異なるオリジン(ドメイン、プロトコル、ポート)のリソースを要求する際に、クロスオリジンHTTPリクエストを実行します。例として、フロントエンド(UI)とバックエンド(サービス)を持つアプリケーションを考えてみましょう。フロン
-
C# ASP.NET Web APIのアクションメソッドからカスタム結果タイプを返す方法
ASP.NET Web APIでは、IHttpActionResultインターフェースを実装することで、独自のカスタムクラスを結果タイプとして作成できます。IHttpActionResultインターフェースには、HttpResponseMessageインスタンスを非同期に生成する単一のメソッド ExecuteAsync が定義されています。public interface IHttpActionResult { Task<HttpResponseMessage> ExecuteAsync( CancellationToken cancellationToke