如何在 Asp.Net WebAPI C# 中指定 MIME 类型?


媒体类型,也称为 MIME 类型,用于识别数据片段的格式。在 HTTP 中,媒体类型描述消息体的格式。媒体类型由两个字符串组成,一个类型和一个子类型。例如 -

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

当 HTTP 消息包含实体主体时,Content-Type 标头指定消息体的格式。这告诉接收方如何解析消息主体的内容。

当客户端发送请求消息时,它可以包含 Accept 标头。Accept 标头告诉服务器客户端希望从服务器获取哪种媒体类型。

Accept: text/html,application/xhtml+xml,application/xml

媒体类型决定了 Web API 如何序列化和反序列化 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.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 }
      );
   }
}

使用以上代码,我们删除了 XmlFormatter,这迫使 ASP.NET Web API 始终返回 JSON,而不管客户端请求中的 Accept 标头值如何。当您希望您的服务仅支持 JSON 而不支持 XML 时,请使用此技术。

从以上输出中我们可以看到,无论 Accept 标头值 application/xml 如何,Web API 服务都将始终返回 JSON。

示例:无论 Accept 标头值如何,都只从 ASP.NET Web API 服务返回 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。

示例:当浏览器发出请求时,从 ASP.NET Web API 服务返回 JSON 而不是 XML -

当浏览器向我们的 StudentController 发出请求时,响应将采用 XML 格式。这是因为浏览器默认发送 text/html 作为 Accept 标头。

现在让我们看看如何在浏览器发出请求时发送 JSON 响应而不是 XML。

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。

更新于: 2020-09-24

2K+ 阅读量

启动你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.