WEB APIのASP.NET属性ルーティング例の詳細説明

Y2J
リリース: 2017-04-25 15:49:22
オリジナル
2229 人が閲覧しました

以下は従来の MVC ルーティングです

 config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional },
      );
ログイン後にコピー

以下のような効果を持つルーティングを実現したい場合は、従来の規約ルーティングを使用する方が面倒です。

rreee

属性ルーティングを使用すると、より簡単になります。

新しい WEB API プロジェクトを作成する場合は、App_Start ディレクトリの WebApiConfig.cs ファイルを開き、次のコードを追加して属性ルーティング構成を有効にします。

order/Miles/三只松鼠干果/2袋
order/2017/1/13
ログイン後にコピー

属性ルーティングは、次のように規約ルーティングと混合することもできます:

 config.MapHttpAttributeRoutes();
ログイン後にコピー

次のように、属性ルーティングを使用するメソッドに機能マークを付けます:

 public static void Register(HttpConfiguration config)
    {
      // Web API 配置和服务

      // Web API 路由
      config.MapHttpAttributeRoutes();

      config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional },
        constraints: new { id=@"\d+"}
      );
    }
ログイン後にコピー

テスト結果 (URL はエンコードされています。それ以外の場合は 400 エラーが発生します) )


通常、同じコントローラー内のすべてのルートは同じプレフィックスで始まります

 [Route("order/{UserNickName}/{ProductName}/{count}")]
ログイン後にコピー

これは明らかにさらに面倒です。そこで、[RoutePrefix] 属性を使用してパブリック プレフィックスを設定します

テスト結果

[RoutePrefix] が使用されている場合、一部の特別な API では、次のようにチルダを使用してルート プレフィックスを書き換えることができます。

テスト結果(同じクラスの下)以下の通り

テスト結果

パラメータがInt型でない場合、ルートは一致しません

以下はサポートされるいくつかの制約です

複数使用できますconstraints ですが、コロンを使用して区切ります

  [Route("api/books")]
  [Route("api/books/{id:int}")]
  [Route("api/books")]
ログイン後にコピー

結果

範囲内にない場合は一致しません


カスタムルーティング制約はIHttpRouteConstraintインターフェイスを実装する必要があります。詳細については、を確認してください。公式

[Route("users/{id:int:length(1,3)}")]
public User GetUserById(int id) { ... }
ログイン後にコピー
登録制約

public class NonZeroConstraint : IHttpRouteConstraint
{
  public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, 
    IDictionary<string, object> values, HttpRouteDirection routeDirection)
  {
    object value;
    if (values.TryGetValue(parameterName, out value) && value != null)
    {
      long longValue;
      if (value is long)
      {
        longValue = (long)value;
        return longValue != 0;
      }

      string valueString = Convert.ToString(value, CultureInfo.InvariantCulture);
      if (Int64.TryParse(valueString, NumberStyles.Integer, 
        CultureInfo.InvariantCulture, out longValue))
      {
        return longValue != 0;
      }
    }
    return false;
  }
}
ログイン後にコピー

制約の使用

public static class WebApiConfig
{
  public static void Register(HttpConfiguration config)
  {
    var constraintResolver = new DefaultInlineConstraintResolver();
    constraintResolver.ConstraintMap.Add("nonzero", typeof(NonZeroConstraint));

    config.MapHttpAttributeRoutes(constraintResolver);
  }
}
ログイン後にコピー

オプションの URI パラメーターとデフォルト値

ルート パラメーターにマークを付ける疑問符を追加すると、ルート パラメーターをオプションの URI パラメーターにすることができます。ルート パラメータがオプションの場合は、メソッド パラメータのデフォルト値を定義する必要があります。

[Route("{id:nonzero}")]
public HttpResponseMessage GetNonZero(int id) { ... }
ログイン後にコピー

またはルーティングテンプレートでデフォルト値を定義します

public class BooksController : ApiController
{
  [Route("api/books/locale/{lcid:int?}")]
  public IEnumerable<Book> GetBooksByLocale(int lcid = 1033) { ... }
}
ログイン後にコピー

以上がWEB APIのASP.NET属性ルーティング例の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート