2012-06-12 27 views
5

La API web parece ser solo adecuada para los casos de uso estándar. Pero quiero hacer un enrutamiento más complejo, pero no puedo encontrar documentación para el enrutamiento complejo. Si tengo más controlador, las rutas se vuelven cada vez más complicadas.API web ASP.NET 4 MVC: documentación para enrutamiento complejo

¿Puedo definir varios parámetros opcionales con dependencias? De esta manera:

/api/document/{par1}/{par2} 

par1 & par2 deben ser opcional, pero par2 deben ser sólo comparable si par1 está presente.

¿Y son posibles los parámetros recursivos?

/api/documents/characteristics/{round/green/red-dots} 
/api/documents/characteristics/{square/yellow} 
/api/documents/characteristics/{square/yellow/flat} 
/api/documents/characteristics/{square/yellow/flat/...} 

¿Hay una documentación detallada para el enrutamiento de la API en la web? El tutorial de microsoft es demasiado básico ... Necesito más información sobre el enrutamiento.

Tengo dos controladores y algunos problemas porque dos rutas son bastante similares, por lo que se toma la ruta incorrecta. Puedo usar [Action] -Attribute como solución alternativa, pero esto no parece correcto ... También tengo que considerar el orden de las rutas. Esto es lógico, pero no se menciona en ninguna parte. ¿La API web es solo para aplicaciones de descanso simples?


Editar: He intentado esto:

routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{mandant}/documents/{id}", 
      defaults: new { controller = "documents", id = RouteParameter.Optional } 
      ); 

//routes.MapHttpRoute(
// name: "DefaultApiWithAction", 
// routeTemplate: "api/{mandant}/documents/{id}/{action}", 
// defaults: new { controller = "documents" } 
// ); 

Tengo dos métodos:

[AcceptVerbs("get")] 
public HttpResponseMessage Get(int id) 

[ActionName("file")] 
[AcceptVerbs("get")] 
public HttpResponseMessage filedownload(int id) 

ahora tengo el problema, el archivo-acción se desencadena incluso si comentar la segunda ruta y el método normal de obtener documento específico no se desencadena porque hay varias acciones ... Probé el atributo [NoAction] pero este s no funciona ... ¿Pero por qué se activará el método de archivo si no hay acción en la plantilla de ruta? (O si la segunda ruta está activa, ¿por qué el método get-document normal no se activará si no hay acción en la url ...) Mi solución actual es establecer una acción predeterminada para todos los demás métodos, pero esta no es una buena solución.

Respuesta

8

se pueden utilizar restricciones de enrutamiento para establecer las condiciones en el enrutamiento en global.asax como:

routes.MapRoute(
    "ApiRoute", 
    "api/document/{par1}/{par2}", 
    new {controller="Document", action="SomeMethod"}, 
    new {par1 = @"\d+" } 
); 

En el último parámetro puede especificar una expresión regular que tiene que ser emparejado para el parámetro especificado para la ruta que se usado. En el ejemplo anterior par1 se utiliza para los dígitos únicos, pero se puede utilizar cualquier expresión regular, como:

routes.MapRoute(
    "ApiRoute", 
    "api/document/{par1}/{par2}", 
    new {controller="Document", action="SomeMethod"}, 
    new {par1 = @"(value1|value2|value3)" } 
); 
+0

Ajuste del regulador estática por defecto debe manejar los conflictos de ruta. Que puedes usar restricciones es nuevo para mí. Gracias. Una buena documentación de Microsoft para el enrutamiento de API web sería genial. También encontré que puedes usar el parámetro * como catch-all como este {* param} pero tiene que estar al final de la url. – user437899

+2

Encontré este documento genérico para enrutamiento asp.net: http://msdn.microsoft.com/en-us/library/cc668201.aspx – user437899

Cuestiones relacionadas