La URL que intento que funcione es una del estilo de: http://somedomain.com/api/people/staff.33311 (al igual que los sitios como LAST.FM permiten todo tipo de signos en sus URL RESTFul y WebPage , por ejemplo, " http://www.last.fm/artist/psy'aviah " es una URL válida para LAST.FM).
Lo que funciona son los siguientes escenarios: - http://somedomain.com/api/people/ - que devuelve todas las personas - http://somedomain.com/api/people/staff33311 - funcionaría también, pero no es lo que yo ' m después de que quisiera que la URL aceptara un "punto", como en el ejemplo siguiente, http://somedomain.com/api/people/staff.33311 , pero esto me da una
HTTP Error 404.0 - Not Found
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.
He configurado las siguientes cosas:
El controlador "PeopleController"
public IEnumerable<Person> GetAllPeople() { return _people; } public IHttpActionResult GetPerson(string id) { var person = _people.FirstOrDefault(p => p.Id.ToLower().Equals(id.ToLower())); if (person == null) return NotFound(); return Ok(person); }
WebApiConfig.cs
public static void Register(HttpConfiguration config) { // Web API configuration and services // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); }
Ya intenté seguir todos los consejos de esta publicación de blog http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx pero aún así no funcionará. También creo que es bastante tedioso y me pregunto si no hay otro, forma mejor y más segura.
Tenemos nuestras identificaciones internas así, así que tendremos que encontrar una solución para ajustar el punto de una forma u otra, preferiblemente en el estilo de "." pero estoy abierto a sugerencias alternativas de URL si es necesario ...
fuente
Respuestas:
La siguiente configuración en su
web.config
archivo debería solucionar su problema:fuente
Agregue un sufijo a la URL, por ejemplo, en
http://somedomain.com/api/people/staff.33311/
lugar dehttp://somedomain.com/api/people/staff.33311
.fuente
google.com/my query goes here/
contragoogle.com/subDomain my query goes here
.Descubrí que agregar lo siguiente antes del estándar me
ExtensionlessUrlHandler
resuelve el problema:No creo que el nombre realmente importe demasiado, excepto que probablemente ayude si su IDE (Visual Studio en mi caso) está administrando la configuración de su sitio.
H / T a https://stackoverflow.com/a/15802305/264628
fuente
No sé qué estoy haciendo realmente, pero después de jugar un poco con la respuesta anterior, se me ocurrió otra solución, quizás más apropiada:
fuente
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="managedHandler" />
Descubrí que necesitaba hacer algo más que establecer el
runAllManagedModulesForAllRequests
atributo entrue
. También tuve que asegurarme de que el controlador de URL sin extensión estuviera configurado para buscar en todas las rutas. Además, hay una opción de configuración adicional que puede agregar y que ayudará en algunos casos. Aquí está mi Web.config de trabajo:Tenga en cuenta, específicamente, que
ExtensionlessUrlHandler-Integrated-4.0
tiene supath
atributo establecido*
como opuesto a*.
(por ejemplo).fuente
path="*."
. Solo por curiosidad, ¿cuál es la razón por la que la gente lo establecepath="*."
?path="*"
y tuve un problema porque estamos alojando un sitio de documentación al lado de nuestra WebAPI y ese sitio tenía problemas con .jpg, .png y otros archivos con extensiones.<modules runAllManagedModulesForAllRequests="true" />
? Eso debería hacer que .NET maneje esos archivos estáticos.Me quedé atascado en esta situación, pero agregar
/
al final de la URL no se veía limpio para mí.así que simplemente agregue a continuación en la etiqueta web.config
handlers
y estará listo para comenzar.fuente
Descubrí que ambas formas funcionan para mí: ya sea configurando runAllManagedModulesForAllRequests en verdadero o agregue ExtentionlessUrlHandler de la siguiente manera. Finalmente, elijo agregar extensionUrLHandler ya que runAllManagedModulesForAllRequests tiene un impacto en el rendimiento del sitio.
fuente
Usaría esto en el archivo Web.config:
antes del estándar "ExtensionlessUrlHandler".
Por ejemplo en mi caso lo pongo aquí:
Por lo tanto, obliga a que las URL de dicho patrón sean administradas por usted, en lugar de la administración estándar como archivos en el árbol de directorios de la aplicación.
fuente
Enfrenté el mismo problema y las circunstancias en las que estaba en las que se suponía que no debía jugar con IIS y configuraciones relacionadas con la configuración del sitio web. Así que tuve que hacer que funcionara haciendo cambios solo a nivel de código.
El punto simple es que el caso más común en el que terminaría teniendo un carácter de punto en la URL es cuando obtiene alguna entrada del usuario y la pasa como una cadena de consulta o un fragmento de URL para pasar algún argumento a los parámetros en el método de acción de su controlador.
Eche un vistazo a la siguiente URL donde el usuario ingresa su identificación de usuario para obtener sus datos personales:
Dado que simplemente tiene que buscar algunos datos del servidor, usamos el
GET
verbo http . Durante el uso deGET
llamadas, los parámetros de entrada solo se pueden pasar en los fragmentos de URL.Entonces, para resolver mi problema, cambié el verbo http de mi acción a
POST
. HttpPOST
verb tiene la facilidad de pasar cualquier entrada de usuario o no usuario en el cuerpo también. Así que creé un dato JSON y lo pasé al cuerpo de laPOST
solicitud http :Cambie la definición de su método de la siguiente manera:
Nota : Más información sobre cuándo usar el
GET
verbo y cuándo usar elPOST
verbo aquí .fuente