web-dev-qa-db-ja.com

「DefaultInlineConstraintResolver」が「apiVersion」を解決できないのはなぜですか

デフォルト値コントローラーを使用した基本的なWebApi実装セットアップがあります。

RESTful WebApiバージョニングに関するブログを読む パッケージを新しいWebApiプロジェクトに統合することにしました。

APIのバージョン管理を支援するために、NuGetパッケージMicrosoft.AspNet.WebApi.Versioningを追加しました。以下は、私がフォローしているパッケージ構成手順へのURLです。

https://github.com/Microsoft/aspnet-api-versioning/wiki/Configuring-Your-Application

私の値コントローラーは非常に簡単です。 Getメソッドに装飾を追加しました。コードは次のとおりです。

[Authorize]
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/values")]
public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
public string Get(int id)
{
    return "value";
}

// POST api/values
public void Post([FromBody]string value)
{
}

// PUT api/values/5
public void Put(int id, [FromBody]string value)
{
}

// DELETE api/values/5
public void Delete(int id)
{
}
}

残念ながら、次のコード行をコントローラーに追加するとすぐに、すべてが爆発します。

[Route("api/v{version:apiVersion}/values")]

返されたエラーメッセージを以下に示します。

The inline constraint resolver of type 'DefaultInlineConstraintResolver' was unable to resolve the following inline constraint: 'apiVersion'. 

Line 82:             GlobalConfiguration.Configure(WebApiConfig.Register);

Startup.cs内にあるコードは次のとおりです。

public void Configuration(IAppBuilder app)
        {
            // HTTP Configuration
            HttpConfiguration config = new HttpConfiguration();
            //config.MapHttpAttributeRoutes();

            // Configure API Versioning
            config.AddApiVersioning();
            var constraintResolver = new DefaultInlineConstraintResolver()
            {
                ConstraintMap =
                {
                    ["apiVersion"] = typeof( ApiVersionRouteConstraint ) // or mvc routing?
                }
            };
            config.MapHttpAttributeRoutes(constraintResolver);   

            // Configure the API to accept token authentication
            ConfigureOAuthTokenConsumption(app);

            // CORS
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

            // Configure the Authorization server
            ConfigureOAuth(app);

            // Use WebAPI
            app.UseWebApi(config);



             // Moved from global.asax
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

AddApiVersioningを呼び出して、ドキュメントで概説されているconstraintResolverを提供すると問題は解決すると思いましたが、解決しませんでした。今、私は次に何をすべきかに苦労しています。

config.AddApiVersioning();
            var constraintResolver = new DefaultInlineConstraintResolver()
            {
                ConstraintMap =
                {
                    ["apiVersion"] = typeof( ApiVersionRouteConstraint ) // or mvc routing?
                }
            };
            config.MapHttpAttributeRoutes(constraintResolver);

助言がありますか?

18
Zoop

WebApiConfig.csファイルのバージョンを解決する必要があります

     var constraintResolver = new DefaultInlineConstraintResolver()
        {
            ConstraintMap =
            {
                ["apiVersion"] = typeof( ApiVersionRouteConstraint ) 
            }
        };
        config.MapHttpAttributeRoutes(constraintResolver); 

ルートをマッピングする前。つまり、config.Routes.MapHttpRoute()の前

18
Champ