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?
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 ()