Personaje de punto ‘.’ en MVC Web API 2 para solicitud como api / people / STAFF.45287

La URL que trato de dejar funcionar es una en el 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 a 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 siguiente ejemplo – 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:

  1. El controlador “PeopleController”

     public IEnumerable 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); } 
  2. El 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 traté de seguir todos los consejos de este blogpost http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx pero aún no funcionará. También creo que es bastante tedioso y me pregunto si no hay otro, mejor y más seguro.

Tenemos nuestra ID internamente así, así que vamos a tener que encontrar una solución para encajar el punto de una forma u otra, preferiblemente en el estilo de “.” pero estoy abierto a sugerencias alternativas para URL si es necesario …

La siguiente configuración en su archivo web.config debería solucionar su problema:

    

Sufija la URL con una barra inclinada, por ejemplo, http://somedomain.com/api/people/staff.33311/ lugar de http://somedomain.com/api/people/staff.33311 .

Descubrí que agregar lo siguiente antes de que el ExtensionlessUrlHandler estándar resuelva el problema para mí:

  

No creo que el nombre realmente importe tanto, pero probablemente sea útil si tu IDE (Visual Studio en mi caso) está administrando la configuración de tu sitio.

H / T a https://stackoverflow.com/a/15802305/264628

No sé lo que estoy haciendo realmente, pero después de jugar un poco con la respuesta anterior, se me ocurrió otra solución, quizás la más adecuada:

       

Descubrí que necesitaba hacer algo más que simplemente establecer el atributo runAllManagedModulesForAllRequests en true . También tuve que asegurarme de que el controlador de URL sin extensión estuviera configurado para examinar todas las rutas. Además, hay una configuración adicional de configuración de bonificación que puede agregar, que ayudará en algunos casos. Aquí está mi trabajo Web.config:

             

Tenga en cuenta, específicamente, que el ExtensionlessUrlHandler-Integrated-4.0 tiene su atributo de path establecido en * en oposición a *. (por ejemplo).

Me quedé atrapado en esta situación, pero agregar / al final de la URL no me pareció limpio.

así que solo agregue a continuación en la etiqueta de handlers web.config y estará listo.

  

Descubrí que ambas cosas me funcionan bien: estableciendo runAllManagedModulesForAllRequests en true o agregando ExtentionlessUrlHandler de la siguiente manera. Finalmente elijo agregar extensionUrLHandler ya que runAllManagedModulesForAllRequests tienen un impacto en el rendimiento del sitio.

        

Enfrenté el mismo problema y las circunstancias en las que estaba cuando no se suponía que debía jugar con IIS y la configuración relacionada con la configuración del sitio web. Así que tuve que hacerlo funcionar haciendo cambios solo al nivel de código.

El punto simple es que el caso más común en el que terminarías teniendo carácter de punto en la URL es cuando obtienes alguna entrada del usuario y la pasas 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 tu controlador.

 public class GetuserdetailsbyuseridController : ApiController { string getuserdetailsbyuserid(string userId) { //some code to get user details } } 

Eche un vistazo a la URL siguiente donde el usuario ingresa su identificación de usuario para obtener sus datos personales:

 http://mywebsite:8080/getuserdetailsbyuserid/foo.bar 

Ya que simplemente tiene que obtener algunos datos del servidor, usamos el verbo http GET . Al usar llamadas GET , cualquier parámetro de entrada solo se puede pasar en los fragmentos de URL.

Entonces para resolver mi problema cambié el verbo http de mi acción a POST . El verbo Http POST tiene la facilidad de pasar cualquier entrada de usuario o no en el cuerpo también. Así que creé una información JSON y la pasé al cuerpo de la POST http POST :

 { "userid" : "foo.bar" } 

Cambia la definición de tu método de la siguiente manera:

 public class GetuserdetailsbyuseridController : ApiController { [Post] string getuserdetailsbyuserid([FromBody] string userId) { //some code to get user details } } 

Nota : Más sobre cuándo usar el verbo GET y cuándo usar el verbo POST aquí .