c# - route - El enrutamiento de atributos MVC no funciona
web forms c# ejemplos (5)
Soy relativamente nuevo en el framework MVC pero tengo un proyecto web en funcionamiento con un controlador API que utiliza AttributeRouting (paquete NuGet). Sin embargo, estoy comenzando otro proyecto y simplemente no quiere seguir las rutas que puse lugar.
Controlador:
public class BlazrController : ApiController
{
private readonly BlazrDBContext dbContext = null;
private readonly IAuthProvider authProvider = null;
public const String HEADER_APIKEY = "apikey";
public const String HEADER_USERNAME = "username";
private Boolean CheckSession()
{
IEnumerable<String> tmp = null;
List<String> apiKey = null;
List<String> userName = null;
if (!Request.Headers.TryGetValues(HEADER_APIKEY, out tmp)) return false;
apiKey = tmp.ToList();
if (!Request.Headers.TryGetValues(HEADER_USERNAME, out tmp)) return false;
userName = tmp.ToList();
for (int i = 0; i < Math.Min(apiKey.Count(), userName.Count()); i++)
if (!authProvider.IsValidKey(userName[i], apiKey[i])) return false;
return true;
}
public BlazrController(BlazrDBContext db, IAuthProvider auth)
{
dbContext = db;
authProvider = auth;
}
[GET("/api/q/users")]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
[GET("api/q/usersauth")]
public string GetAuth()
{
if (!CheckSession()) return "You are not authorized";
return "You are authorized";
}
}
AttributeRoutingConfig.cs
public static class AttributeRoutingConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
// See http://github.com/mccalltd/AttributeRouting/wiki for more options.
// To debug routes locally using the built in ASP.NET development server, go to /routes.axd
routes.MapAttributeRoutes();
}
public static void Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
Global.asax.cs:
// Nota: para obtener instrucciones sobre cómo habilitar el modo clásico IIS6 o IIS7, // visite http://go.microsoft.com/?LinkId=9394801
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
Cuando trato de navegar a / api / q / users, obtengo un error 404 no encontrado. Si cambio las rutas para que sean "/ api / blazr / users", recibo un error sobre varias acciones y no puedo determinar qué acción tomar.
Se agradece cualquier ayuda, solo necesito un pequeño empujón para descubrir dónde está el problema, no hay necesidad de resolverlo completamente para mí (¡tengo que aprender!)
Gracias
EDITAR
routes.axd:
api/{controller}/{id}
{resource}.axd/{*pathInfo}
{controller}/{action}/{id}
Asegúrese de tener instalado el paquete NuGet "WebApp API" para AttributeRouting.
En el administrador de paquetes nuGet, instale en su proyecto el paquete Web Host Web API
agrega esta clase a la carpeta app_start-> WebApiConfig.cs (si no sale, crea):
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes(); // pay attention to this method
//here you can map any mvc route
//config.Routes.MapHttpRoute(
// name: "DefaultApi",
// routeTemplate: "api/{controller}/{id}",
// defaults: new { id = RouteParameter.Optional }
//);
config.EnableSystemDiagnosticsTracing();
}
}
después de Try, cambie su configuración de Global.asax a:
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
PD
repase este artículo, muy útil http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
aclamaciones
En su App_Start / RoutesConfig.cs
asegúrese de llamar a la siguiente línea de código:
routes.MapMvcAttributeRoutes();
No solo debe tener la llamada a routes.MapMvcAttributeRoutes()
en su archivo App_Start/RouteConfig.cs
, debe aparecer antes de definir su ruta predeterminada. Lo agrego antes y luego de ignorar {resource}.axd{*pathInfo}
. Acabo de descubrir que estoy intentando que el enrutamiento de atributos funcione correctamente con mi sitio web MVC 5.
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Account", action = "Index", id = UrlParameter.Optional }
);
}
Vine aquí en busca de respuestas relacionadas con RoutePrefix
. Después de algunas pruebas, descubrí que simplemente agregando un
[RoutePrefix("MyPrefix")]
sin usar un atributo de ruta posterior como
[Route("MyRoute")]
significa que se ha ignorado RoutePrefix. El enrutador de ruta de Haack es muy útil para determinar esto: https://haacked.com/archive/2008/03/13/url-routing-debugger.aspx/
Simplemente agréguelo a través de NuGet, que agregará una línea a sus aplicaciones, y luego todas sus rutas se mostrarán en la parte inferior de su página. Muy recomendable para cualquier problema de enrutamiento.
Al final, mi versión final se ve así:
[RoutePrefix("Asset/AssetType")] [Route("{action=index}/{id?}")]