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

C#ASP.NET WebAPIでカスタムメディアタイプを使用してバージョン管理を行う方法は?


メディアタイプを使用すると、APIはペイロード内のデータを解釈する方法をクライアントに通知できます。 HTTPプロトコルでは、メディアタイプは、text / html、application / json、application / xmlなどの識別子で指定されます。これらは、最も一般的なWeb形式であるHTML、JSON、XMLにそれぞれ対応します。 application / vnd.api + jsonなど、他にもAPI固有のメディアタイプがあります。

以下は、メディアタイプで送信する必要があるバージョンです。

application/vnd.demo.students.v1+json StudentsV1Controller
application/vnd.demo.students.v2+json StudentsV2Controller

C#ASP.NET WebAPIでカスタムメディアタイプを使用してバージョン管理を行う方法は?

独自のCustomControllerSelectorを追加する 上記のエラーを修正します。

CustomControllerSelector

using System.Linq;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Web.Http;
using System.Web.Http.Controllers;
using System.Web.Http.Dispatcher;
namespace WebAPI.Custom{
   public class CustomControllerSelector : DefaultHttpControllerSelector{
      private HttpConfiguration _config;
      public CustomControllerSelector(HttpConfiguration config) : base(config){
         _config = config;
      }
      public override HttpControllerDescriptor SelectController(HttpRequestMessage
      request){
         var controllers = GetControllerMapping();
         var routeData = request.GetRouteData();
         var controllerName = routeData.Values["controller"].ToString();
         string versionNumber = "";
         string regex = @"application\/vnd\.demo\.([a-z]+)\.v(?<version>[0-9]+)\+([a-z]+)";
         var acceptHeader = request.Headers.Accept
            .Where(a => Regex.IsMatch(a.MediaType, regex,
            RegexOptions.IgnoreCase));
         if (acceptHeader.Any()){
            var match = Regex.Match(acceptHeader.First().MediaType,
            regex, RegexOptions.IgnoreCase);
            versionNumber = match.Groups["version"].Value;
         }
         HttpControllerDescriptor controllerDescriptor;
         if (versionNumber == "1"){
            controllerName = string.Concat(controllerName, "V1");
         }
         else if (versionNumber == "2"){
            controllerName = string.Concat(controllerName, "V2");
         }
         if (controllers.TryGetValue(controllerName, out controllerDescriptor)){
            return controllerDescriptor;
         }
         return null;
      }
   }
}

WebApi.Config.cs

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

StudentV1Controller

using DemoWebApplication.Models;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace DemoWebApplication.Controllers{
   public class StudentV1Controller : ApiController{
      List<StudentV1> students = new List<StudentV1>{
         new StudentV1{
            Id = 1,
            Name = "Mark"
         },
         new StudentV1{
            Id = 2,
            Name = "John"
         }
      };
      public IEnumerable<StudentV1> Get(){
         return students;
      }
      public StudentV1 Get(int id){
         var studentForId = students.FirstOrDefault(x => x.Id == id);
         return studentForId;
      }
   }
}

StudentV2Controller

using DemoWebApplication.Models;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace DemoWebApplication.Controllers{
   public class StudentV2Controller : ApiController{
      List<StudentV2> students = new List<StudentV2>{
         new StudentV2{
            Id = 1,
            FirstName = "Roger",
            LastName = "Federer"
         },
         new StudentV2{
            Id = 2,
            FirstName = "Tom",
            LastName = "Bruce"
         }
      };
      public IEnumerable<StudentV2> Get(){
         return students;
      }
      public StudentV2 Get(int id){
         var studentForId = students.FirstOrDefault(x => x.Id == id);
         return studentForId;
      }
   }
}

以下の出力は、カスタムメディアタイプのバージョン管理を使用してStudentV1およびStudentV2コントローラーから取得した結果を示しています。

C#ASP.NET WebAPIでカスタムメディアタイプを使用してバージョン管理を行う方法は?

C#ASP.NET WebAPIでカスタムメディアタイプを使用してバージョン管理を行う方法は?

したがって、カスタムメディアタイプを使用してxml形式で同じ出力を取得する場合は、以下のカスタムメディアタイプをwebapiconfig.csに追加します

public static void Register(HttpConfiguration config){
   config.MapHttpAttributeRoutes();
   config.Services.Replace(typeof(IHttpControllerSelector), new
   CustomControllerSelector(config));
   config.Formatters.XmlFormatter.SupportedMediaTypes
      .Add(new MediaTypeHeaderValue("application/vnd.demo.student.v1+xml"));
   config.Formatters.XmlFormatter.SupportedMediaTypes
      .Add(new MediaTypeHeaderValue("application/vnd.demo.student.v2+xml"));
   config.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{id}",
      defaults: new { id = RouteParameter.Optional }
   );
}

C#ASP.NET WebAPIでカスタムメディアタイプを使用してバージョン管理を行う方法は?

上記の例では、出力がカスタムメディアタイプで指定されたXML形式であることがわかります。


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

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

  2. ズームでカスタム背景を使用する方法

    パンデミックの間、何百万人もの人々がビデオ会議にズームを使い始めました。多くの人が、ビデオの背景を後ろの部屋から文字通り好きなものに変更できるカスタム背景機能を利用しています。事前設定された背景のセットから選択するか、独自の背景をカスタマイズしてアップロードできます。これは、火星の写真を使用することから、背後にある本棚までさまざまです。可能性は文字通り無限です。 カスタム背景のズーム機能は通常、かなりうまく機能します。それを機能させるために高価なグリーンスクリーンのセットアップは必要ありません。それがあなたの顔の特徴とあなたの後ろの背景を区別することができる限り、それはうまくいくでしょう。ズ