servicio - web api rest c#
¿Por qué no se llama a mi método API web con argumentos dobles? (2)
Como señaló Joel, es probable que IIS esté recogiendo la extensión de archivo y tratando de publicar un archivo estático. Puede solucionar esto agregando lo siguiente en su archivo web.config (en system.webServer
):
<modules>
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule"
preCondition="" />
</modules>
De forma predeterminada, IIS solo ejecutará este módulo para lo que considere solicitudes de recursos de ASP.NET. Lo anterior elimina esta condición por sitio, lo que le permite enrutar todas las solicitudes a través del enrutamiento ASP.NET MVC / Web API.
Los archivos estáticos seguirán siendo preferidos si existen, por lo que esto no debería causar ningún problema en otro lugar.
Tengo un método de API web que toma dos doble args:
Interfaz de repositorio:
public interface IInventoryItemRepository
{
. . .
IEnumerable<InventoryItem> GetDepartmentRange(double deptBegin, double deptEnd);
. . .
}
Repositorio:
public IEnumerable<InventoryItem> GetDepartmentRange(double deptBegin, double deptEnd)
{
// Break the doubles into their component parts:
int deptStartWhole = (int)Math.Truncate(deptBegin);
int startFraction = (int)((deptBegin - deptStartWhole) * 100);
int deptEndWhole = (int)Math.Truncate(deptEnd);
int endFraction = (int)((deptBegin - deptEndWhole) * 100);
return inventoryItems.Where(d => d.dept >= deptStartWhole).Where(e => e.subdept >= startFraction)
.Where(f => f.dept <= deptEndWhole).Where(g => g.subdept >= endFraction);
}
Controlador:
[Route("api/InventoryItems/GetDeptRange/{BeginDept:double}/{EndDept:double}")]
public IEnumerable<InventoryItem> GetInventoryByDeptRange(double BeginDept, double EndDept)
{
return _inventoryItemRepository.GetDepartmentRange(BeginDept, EndDept);
}
Cuando intento invocar este método, a través de:
http://localhost:28642/api/inventoryitems/GetDeptRange/1.1/99.99
... obtengo, " HTTP Error 404.0 - No encontrado El recurso que está buscando ha sido eliminado, ha cambiado su nombre o no está disponible temporalmente " .
Los métodos relacionados funcionan bien (otros métodos en este Controlador).
Pude reproducir esto en mi máquina.
Simplemente agregando un / al final de la URL me lo corrigió. Parece que el motor de enrutamiento lo está viendo como una extensión de archivo .99, en lugar de un parámetro de entrada.
http://localhost:28642/api/inventoryitems/GetDeptRange/1.1/99.99/
Además, parece que puede registrar una ruta personalizada que agrega automáticamente una barra al final de la URL cuando usa los ayudantes integrados para generar el enlace. No lo he probado personalmente: Agregue una barra al final de cada url
La solución más fácil es simplemente agregar la siguiente línea a su RouteCollection. No estoy seguro de cómo lo haría con el atributo, pero en su RouteConfig, simplemente agregue esto:
routes.AppendTrailingSlash = true;