C#ASP.NET WebAPIでQuerystringパラメーターを使用してバージョン管理を行う方法は?
DefaultHttpControllerSelector Web APIのクラスは、URIで送信する適切なコントローラーアクションメソッドを選択する責任があります。
以下のようなクエリ文字列にバージョニングを実装する必要があるとします
v=1 StudentsV1Controller (Version 1) v=2 StudentsV2Controller (Version 2)
http:// localhost:58174 / api / student?v =1のようなクエリ文字列でバージョン情報を渡すと、DefaultHttpControllerSelectorに存在するSelectController()メソッドがStudentsControllerを検索するため、404NotFoundエラー応答が発生します。 onlyStudentsV1ControllerとStudentsV2Controller。
このケースを処理するには、独自の CustomControllerSelectorを追加する必要があります DefaultHttpControllerSelectorクラスを実装します。
CustomControllerSelector −
例
using System.Net.Http;
using System.Web;
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 = "1";
var versionQueryString =
HttpUtility.ParseQueryString(request.RequestUri.Query);
if (versionQueryString["v"] != null){
versionNumber = versionQueryString["v"];
}
if (versionNumber == "1"){
controllerName = controllerName + "V1";
}
else if (versionNumber == "2"){
controllerName = controllerName + "V2";
}
HttpControllerDescriptor controllerDescriptor;
if (controllers.TryGetValue(controllerName, out controllerDescriptor)){
return controllerDescriptor;
}
return null;
}
}
} 次に、デフォルトのコントローラーセレクターをカスタムコントローラーセレクターに置き換える必要があります。これはWebApiConfig.csファイルで行われます。 IHttpControllerSelectorをCustomControllerSelectorに置き換えていることに注意してください。DefaultHttpControllerSelectorはIHttpControllerSelectorを実装しているため、IHttpControllerSelectorを置き換えています。
例
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およびStudentV2controllersから取得した結果を示しています。
-
C#ASP.NET WebAPIのアクションメソッドからカスタム結果タイプを返す方法は?
IHttpActionResultインターフェイスを実装することで、結果タイプとして独自のカスタムクラスを作成できます。 。 IHttpActionResultには、HttpResponseMessageインスタンスを非同期的に作成する単一のメソッドExecuteAsyncが含まれています。 public interface IHttpActionResult { Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken); } コントロ
-
C#ASP.NET WebAPIでのコントローラーアクションのさまざまな戻り値の種類は何ですか?
Web APIアクションメソッドは、次のリターンタイプを持つことができます。 ボイド プリミティブ型/複合型 HttpResponseMessage IHttpActionResult 無効 − すべてのアクションメソッドが何かを返す必要はありません。ボイドリターンタイプにすることができます。 例 using DemoWebApplication.Models using System.Web.Http; namespace DemoWebApplication.Controllers{ public class DemoCont