web-dev-qa-db-fra.com

Pourquoi «DefaultInlineConstraintResolver» ne peut pas résoudre «apiVersion»

J'ai une configuration d'implémentation WebApi de base avec le contrôleur de valeurs par défaut.

Après lecture d'un blog sur RESTful WebApi Versioning J'ai décidé d'intégrer le package dans un nouveau projet WebApi.

J'ai ajouté le package NuGet Microsoft.AspNet.WebApi.Versioning pour aider au versioning de mon API. Voici l'URL des instructions de configuration des packages que je suis:

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

Mon contrôleur de valeurs est très simple. J'ai ajouté la décoration à ma méthode Get. Voici le code:

[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)
{
}
}

Malheureusement, dès que j'ajoute la ligne de code suivante au contrôleur, le tout explose:

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

Voici un aperçu du message d'erreur renvoyé:

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

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

Voici le code que j'ai à l'intérieur de mon 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);
        }

Je pensais qu'appeler AddApiVersioning et fournir le constraintResolver comme indiqué dans la documentation résoudrait le problème, mais ce n'est pas le cas. Maintenant, je me bats avec quoi faire ensuite.

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

Aucune suggestion?

18
Zoop

Vous devez résoudre la version dans le fichier WebApiConfig.cs

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

avant de cartographier les itinéraires. Je veux dire avant config.Routes.MapHttpRoute ()

18
Champ