c# - route - Error ASP.NET MVC WebAPI 404
web api query string parameters (18)
Además, asegúrese de que su controlador termine en el nombre "Controlador" como en "PizzaPieController".
Tengo una aplicación de formularios web asp.net que se ejecuta en modo integrado v4.0.
Intenté agregar un apicontroller en la carpeta App_Code.
En Global.asax, agregué el siguiente código
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Cuando intenté navegar al controlador en http://localhost/api/Value
, recibí el error 404.
La url sin extensión se configura en la sección del controlador. Tengo formularios y autenticación anónima habilitada para el sitio web.
La URL ExtensionLess está configurada para ''*.''
Cuando presiono la url para el controlador, la solicitud es manejada por StaticHandler en lugar de ExtensionlessUrlHandler-Integrated-4.0.
No tengo idea ahora de por qué el sistema lanzará el error como se muestra en la imagen a continuación.
Aprecio que esta es una pregunta muy antigua, pero pensé que agregaría otra respuesta para futuros usuarios.
Descubrí que esto sucede ahora mismo en un proyecto en el que estaba trabajando solo después de implementarlo en CI / Estadística. La solución consistía en alternar el valor de depuración de compilación = "verdadero" de ida y vuelta mientras se implementaba cada versión en cada entorno una vez, y se arreglaba para mí.
Asegúrate de las siguientes cosas
1.) Asegúrese de que su IIS esté configurado con .NET 4.5 o 4.0 si su API web es 4.5. Instale 4.5 en IIS.
ejecutar este comando en el símbolo del sistema con privilegio de administrador
C:/Windows/Microsoft.NET/Framework/v4.0.30319>aspnet_regiis.exe -i
2.) Cambie su ruta a
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
y hacer una solicitud con Demo / Get (donde demo es tu nombre de controlador)
si el 1,2 no funciona, pruebe 3
3.) Agregue la siguiente configuración en el archivo web.config
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
Copié un dll del controlador basado en RouteAttribute
en la carpeta bin, pero no estaba siendo reconocido como un controlador válido y recibía el error 404 en el cliente.
Después de mucha depuración, encontré mi problema. Fue porque la versión de System.Web.Http.dll
que hacía referencia el controlador era diferente de la versión de System.Web.Http.dll
que hacía referencia el proyecto principal (el que contenía global.asax.cs).
Asp.Net encuentra el controlador por reflexión usando código como este
internal static bool IsControllerType(Type t)
{
return
t != null &&
t.IsClass &&
t.IsVisible &&
!t.IsAbstract &&
typeof(IHttpController).IsAssignableFrom(t) &&
HasValidControllerName(t);
}
Como IHttpController
es diferente para cada versión de System.Web.Http.dll
, el controlador y el proyecto principal deben tener la misma referencia.
Después de horas dedicando tiempo a esto, encontré la solución a esto en mi caso.
Fue el orden de registrar las Rutas en RouteConfig .
Deberíamos registrar el HttpRoute en la tabla de rutas antes de la ruta del controlador predeterminado. Debe ser como sigue. Route Config Configuración de la tabla de ruta
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
El problema está en tu configuración de enrutamiento. Mvc
enrutamiento de Mvc
es diferente del enrutamiento de WebApi
.
Agregue referencia a System.Web.Http.dll
, System.Web.Http.Webhost.dll
y System.Net.Http.dll
y luego configure su enrutamiento API de la siguiente manera:
GlobalConfiguration.Configuration.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
En mi caso, me olvidé de hacer que se derivara de ApiController.
Entonces se vería como
public class ValuesController : ApiController
Es hora de que agregue mi tonta supervisión a la lista aquí: escribí mal mi ruta de ruta predeterminada de webapi.
Original:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/id",
defaults: new { id = RouteParameter.Optional}
);
Reparado: (observe las llaves alrededor de "id")
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional}
);
Estaba experimentando este problema.
Traté de editar mi WebApiConfig.cs
para cumplir con una serie de recomendaciones aquí y ejemplos de código en otro lugar. Algunos funcionaron, pero no explicaron por qué la ruta no funcionaba cuando WebApiConfig.cs
se codificó exactamente como por el proyecto de plantilla MS WebApi.
Mi problema real era que al agregar manualmente WebApi
a mi proyecto, no había seguido el orden de stock de las llamadas de configuración desde Global.asax
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
// This is where it "should" be
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
// The WebApi routes cannot be initialized here.
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
Podría hacer conjeturas acerca de por qué es esto, pero no investigué más. No fue intuitivo por decir lo menos.
Gracias Shannon, funciona genial =>
Mi orden en mi Global.asax fue:
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
en lugar de la buena:
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);
Intenté todo lo anterior y tuve el mismo problema. Resultó que el grupo de aplicaciones creado en IIS tenía como predeterminado .net 2.0. Cuando lo cambié a 4.0 entonces funcionó de nuevo
Intente simplemente usar la parte de valor del nombre del controlador, como esta:
http://localhost/api/Value
Nota: Por convención, el motor de enrutamiento tomará un valor pasado como nombre de controlador y anexará la palabra
Controller
. Al ponerValueController
en el URI, el motor de enrutamiento buscaba una clase llamadaValueControllerController
, que no encontró.
La configuración de tu ruta se ve bien. Revise la sección de controladores en web.config, para el modo integrado esta es la forma correcta de usar ExtensionLessUrlHandler:
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
Más sobre este tema: http://blogs.msdn.com/b/tmarq/archive/2010/05/26/how-extensionless-urls-are-handled-by-asp-net-v4.aspx
Ninguna de las soluciones anteriores resolvió mi problema ... Mi error fue que copié los archivos bin directamente al servidor de producción, y luego, no funcioné. El 404 desapareció cuando publico el proyecto en el disco y copié la carpeta "publicada" en el servidor. Es un poco obvio, pero puede ayudar a alguien.
Para la URL que has intentado ( http://localhost/api/Value
) asegúrate de que haya un tipo público llamado ValueController
que se deriva de ApiController
y que tenga un método público con algunas de estas características:
- El nombre del método comienza con
Get
(por ejemplo,GetValues
o simplementeGet
). - Hay un atributo
HttpGet
aplicado al método.
En caso de que intente con el código de la plantilla de proyecto de API Web predeterminada, el nombre del controlador es ValuesController
, no ValueController
por lo que la URL será http://localhost/api/values
.
Si no es compatible con ninguno de los anteriores, es posible que desee habilitar el seguimiento, lo que puede proporcionarle información útil sobre el lugar en el que se produce el error (y también el motivo).
Espero que esto ayude.
Si crea el controlador en App_Code, ¿cómo sabe la tabla de enrutamiento dónde está? Ha especificado la ruta como "api / {controller / ..." pero no es donde se encuentra el controlador. Intenta moverlo a la carpeta correcta.
También intente eliminar todo el contenido de su carpeta api bin. El mío contenía dlls antiguos (debido a un cambio de nombre de un gran espacio de nombres) que exponía controladores en conflicto. Aquellos dll no fueron eliminados por la funcionalidad de limpieza de Visual Studio.
(Sin embargo, creo que asp.net web api carece seriamente de información de enrutamiento y depuración en el nivel de depuración).
Tuvimos esto también, cambiando la versión .NET de 4.5 a 4.5.1 o más reciente resolvió el problema