2010-09-17 16 views
5

He probado el siguiente código:¿Puedo usar un objeto en UriTemplate?

[OperationContract] 
[WebInvoke(UriTemplate="/Users/Register/{user}")] 
void Register(User user); 

Pero cuando trato de ejecutar esto, me dice que el UriTemplate sólo debe contener cadenas. ¿Qué pasa si necesito pasar un objeto a mi método como en este caso, un objeto de usuario a mi método de registro.

Si cambio el atributo WebInvoke a:

[WebInvoke(UriTemplate="/Users/Register/")] 

El browswer muestra el error Method not allow cuando intento navegar a http://localhost:8000/Users/Register por ejemplo

Respuesta

6

Está limitado a cadenas en UriTemplate. Puede usar múltiples parámetros para pasar varias cadenas pero no puede usar un tipo complejo. Si desea pasar un tipo complejo, no puede estar en ninguna parte del URI, sino en el cuerpo de una solicitud POST/PUT. La solicitud GET no toma un cuerpo de mensaje. Así que el código anterior podría ser cambiado a esto:

[OperationContract] 
[WebInvoke(Method = "POST", UriTemplate="/Users/Register")] 
void Register(User user); 

Dónde estás pasando el objeto de usuario en, no a través del Uri, sino como parte de la solicitud POST.

+0

Gracias, ¿Pueden explicar lo que quieren decir con parte de la solicitud POST? De hecho, probé lo que mencionaste antes, es solo tener/Users/Register en mi UriTemplate, pero luego cuando navegué a http: // localhost: 8000/Users/Register, dijo Method no permitido. – Xaisoft

+1

¿A qué te refieres cuando dices que "navegaste" hacia la URL? Usted acaba de golpearlo en un navegador? Si es así, eso hizo una solicitud GET que no está permitida cuando usa el atributo [WebInvoke] (necesita usar [WebGet] para eso). [WebInvoke] es para POST/PUT/DELETE (verá que especifiqué "POST") en mi ejemplo de código anterior. echa un vistazo: http://www.pluralsight-training.net/microsoft/olt/howtovideos.aspx?category=WCF%20REST –

+1

oh duh, tienes razón al respecto. La base de todo esto es que un usuario irá a una página de registro, completará algunos campos y se registrará. La parte de Registro será manejada por un POST. Probablemente pueda manejar eso con un clic de botón, ¿verdad? Pero, ¿qué es para evitar que alguien vaya a http: // localhost: 8000/Users/Register? – Xaisoft

0

Es exactamente como se dice. Un URI es, literalmente, solo capaz de contener cadenas. No están hechos para objetos. Probablemente podría convertirlo para tomar un nombre de usuario o id de usuario si lo necesitara ... pero nunca puede usar un tipo de objeto complejo como un URI.

+0

En este caso, todavía no tengo UserId porque primero necesito crear el usuario. – Xaisoft

+1

Iba a crear el usuario en el método de Registro. Tal vez ese es el mal diseño? – Xaisoft

0

No pasa los objetos alrededor como parámetros de cadena de consulta (¿cómo podría? ¿Sería serializarlo de alguna manera?) Debería pasar la identificación de usuario.

+0

Ver comentarios a Steve y md5sum – Xaisoft

Cuestiones relacionadas