2011-07-13 29 views
16

Tengo una solución MVC que aloja algunas rutas para servicios de API web. En algunas situaciones, los llamaré desde JavaScript con un simple HTTP get. En otros, quiero llamarlos desde algún código .NET, quizás otra aplicación MVC.Agregue referencia de servicio al servicio ASP.NET Web API

¿Hay alguna manera de agregar una referencia de servicio a estos puntos finales de API web y hacer que las herramientas creen el cliente proxy y los tipos CLR como lo haría con un servicio WCF típico? Sé que no hay ningún SOAP involucrado aquí, pero sí leí que es posible, pero no cómo.

Respuesta

15

No, es el servicio REST. El servicio REST no expone los metadatos para crear proxy por referencia de servicio (excepto los Servicios de datos WCF que tienen alguna forma especial de metadatos). Use la clase HttpClient de la API web para llamar al servicio.

+0

Gracias por la respuesta. Por lo tanto, no hay un esquema de metadatos expuesto como tal, pero ¿cree que uno podría derivarse de la respuesta al igual que xsd para XML? Agregar una referencia de servicio necesitaría derivar algún tipo de esquema, construir una clase clr basada en esto y el cliente esencialmente deserializaría una colección de esto. ¿Es esto algo que la herramienta podría soportar prácticamente para dar la flexibilidad de usar este tipo de servicio en el momento del diseño? –

+0

Es una excusa bastante poco convincente. El escenario (típico) aquí es que está llamando a su propio servicio, y siempre tiene los metadatos para su propio servicio. Esto es simplemente un problema de herramientas inferiores. Las cosas empeoran si quieres OData: entonces necesitarás escribir tu propio proveedor de linq para obtener la expresividad que tenías con los buenos viejos servicios de WCF. Una mejor herramienta podría cambiar eso. – John

+0

@John: Hay muchos sitios UserVoice ejecutados por MS. Intente aumentar la solicitud (si aún no existe) para agregar soporte para la descripción WADL o WSDL2 para los servicios REST. Una vez que la descripción esté disponible, también puede tener una generación para el cliente. –

1

No directamente, pero a partir de las pocas muestras que he visto, el uso de Web Api implica la configuración de un ServiceContract. Parece que si agrega una segunda interfaz de contrato de servicio con los atributos regulares de DataContract de OperationContract &, entonces puede crear un punto final con un enlace WCF estándar de su elección y su punto final MEX coincidente. El servicio implementará ambas interfaces, por lo que la adición de la referencia de servicio puede obtener un documento WSDL del punto final WCF estándar.

+0

Se deben tener en cuenta algunos detalles, como la serialización (debe ser la misma en ambos casos para evitar la impedancia), los atributos de métodos duplicados (que no son compatibles entre los marcos), también la autenticación y la autorización. Sospecho que es una molestia que no vale la pena los beneficios, pero es una idea interesante, no obstante. – John

8

No tenemos ningún mecanismo estándar para hacerlo. REST consiste en crear sistemas que hagan que los clientes evolucionen independientemente del servidor. HTTP define una interfaz uniforme de GET, PUT, POST, DELETE, etc. por lo tanto no hay necesidad de una descripción de método. Por ambas razones, no hay un REST WSDL equivalente, o debería decir que no hay equivalente que realmente haya ganado impulso entre la comunidad REST (es decir, hay WADL).

El punto de acoplamiento en los servicios REST es realmente alrededor del tipo de medio/el formato del cuerpo. Para eso apoyamos un mecanismo fuertemente tipado. En Web API enviamos un HttpClient (HttpClient en Nuget) que le permite tomar un tipo de CLR y transformarlo en una representación. De fábrica, es compatible con XML y JSON.

Así podría crear un tipo CLR y compartirlo con los clientes, y luego usar HttpClient en el cliente.

Para crear el tipo en sí mismo también hay varias opciones.

  1. crearlo a mano
  2. Usar la función "Pegar como XML" y la función de página de ayuda automática el uso de la API web para copiar/pegar.
Cuestiones relacionadas