2012-07-16 11 views
11

Si se decidió utilizar WebAPI para crear una capa de servicio que se utilizará para una variedad de clientes. ¿Cuál sería la mejor manera de diseñar el cliente web?¿Es antipatrón para llamar a los servicios de WEBAPI desde Controladores MVC?

Como WebAPI es compatible con la web, sería posible consumir esto directamente del cliente mediante javascript. Sin embargo, me preocuparía que esto pueda complicarse bastante rápido y javascript no es la tecnología más fácil de probar.

Una alternativa sería utilizar la clase HttpClient para llamar a los servicios REST desde los controladores MVC. ¿Es este un enfoque válido?

Supongo que los dos enfoques anteriores podrían combinarse, pero me preocuparía que esto se ensucie. ¿Estaría de acuerdo en que sería mejor ir con un enfoque u otro?

Lo siento, he visto muchas publicaciones sobre si utilizar WebAPI o MVC pero ninguna sobre la combinación de las dos.

¿Pensamientos?

+0

¿Ya tiene un proyecto MVC en su aplicación y está tratando de extraer la capa de servicio de él? – VJAI

+0

No, este es un proyecto totalmente nuevo. –

Respuesta

16

Una alternativa sería utilizar la clase HttpClient para llamar a los servicios REST desde los controladores MVC. ¿Es este un enfoque válido?

Sí, absolutamente. Es solo que este código no debe colocarse en sus controladores sino en su capa DAL, porque los controladores no deberían saber de dónde provienen los datos (archivo plano, base de datos, API web, ...).

Así que hay 2 enfoques:

  • Usted decide consumir su API Web desde su aplicación de cliente MVC utilizando el protocolo HTTP. En este caso, crea una implementación para su repositorio (capa DAL) que utilizará el cliente HTTP y devolverá directamente los modelos de dominio
  • Usted decide consumir directamente los servicios contenidos en esta API web sin enviar solicitudes HTTP. En este caso, debe hacer referencia al ensamblaje que contiene la capa de servicio para su API web en su aplicación cliente MVC y directamente este ensamblaje se convierte en la capa de servicio para su aplicación MVC. En este caso, la API web a través de HTTP sirve para otros clientes: javascript, móvil, ...

El enfoque que elija realmente dependerá de su situación y requisitos específicos. ¿Necesita admitir clientes interoperables que no sean su aplicación cliente MVC? En cualquier caso, comience definiendo una capa de servicio en un ensamblaje separado que contenga los modelos de su dominio y esas cosas. Entonces, siempre podría exponer esta capa de servicio a través de una API web (o un servicio WCF o lo que sea) o directamente desde los clientes .NET.

+0

Con respecto al segundo enfoque, ¿cómo se implementaría esto? Poco claro sobre la creación de una instancia de webapi para llamar a los métodos de instancia, ya que parece un problema similar al llamar directamente a los métodos de acción del controlador (en lugar de utilizar RenderAction), ya que el controlador espera que se cree una instancia del marco MVC (para información contextual diversa como HttpRequest.Current, Principle, etc.). Para instanciar una clase webapi de un controlador MVC y llamar al método directamente, la solicitud no pasa por la tubería webapi, ¿entonces esperaría que hubiera más en esto? – AaronLS

+0

No lo desafiamos, solo intentamos visualizar cómo sería este enfoque. Recuerdo que con WCF, si llamabas a un servicio WCF desde otro proceso en la misma máquina, podrías usar named pipes + serialización binaria para un mejor rendimiento. ¿Sabes algo como esto para WebAPI? – AaronLS

+0

@AaronLS, ASP.NET Web API se diseñó para crear servicios web RESTful. En el mundo REST no existe tal noción de canalizaciones con nombre y serialización binaria. –

1

Creo que tiene un proyecto de MVC y está tratando de separar las operaciones de API del proyecto de MVC en un proyecto de API web por separado. Si ese es el caso, debe sopesar los beneficios antes de saltar y crear un proyecto de servicio por separado.

Una vez que haya creado un proyecto de API web separado, no puede consumir fácilmente los métodos de servicio directamente desde javascript en su proyecto MVC debido a la barrera entre dominios (por supuesto, hay JSONP y CORS pero no hacen cosas tan fácil), por lo que debe confiar en la clase HttpClient creando métodos de contenedor innecesarios en sus controladores para comunicarse con el servicio.

Vale la pena pensar que tiene las cosas de API en el mismo proyecto de MVC cuando tiene vistas que necesitan datos proporcionados por sus métodos de API, pero solo tiene que usar ApiController en lugar de Controller.

Cuestiones relacionadas