2010-11-30 20 views
16

Antes de mencionarlo, soy consciente de que esta pregunta se ha formulado antes pero no desde el lanzamiento de WCF4.¿Cuál es la mejor manera de implementar una arquitectura RESTful en .NET hoy?

Por lo tanto, después de leerlo mucho, he decidido que una arquitectura RESTful es el camino a seguir para comenzar una API que proporcione datos. Considerando el lanzamiento del WCF 4, ASP.NET MVC 2 y WCF REST, ¿cuál es la mejor manera de comenzar a implementar una arquitectura RESTful AHORA?

Yo: Estoy muy familiarizado con ASP.NET MVC, así que me sentiría bastante cómodo allí. Mi conocimiento de WCF, sin embargo, es deficiente.

Entonces WCF4 o ASP.NET MVC? (o algo similar al kit de inicio de descanso wcf)? Específicamente Busco:

  • Facilidad de aplicación
  • Sé ASP.NET MVC, no WCF. ¿Vale la pena el WCF la curva de aprendizaje?
  • ¿WCF4 es excesivo para REST o ASP.NET MVC se queda corto en algún momento?
+1

No hay suficiente información para responder la pregunta. Mire las respuestas ya. No tienen sustancia y solo "usan esto porque yo tengo". La única forma de responder estas preguntas es comparando las características con sus requisitos exactos. Debido a que no ha proporcionado nada además de "bajo ancho de banda", que no tiene nada que ver con el marco subyacente y "muchos clientes", que es la definición misma de REST, es casi imposible darle ningún consejo sólido. – jfar

+0

@Alex:/Interpretación impar de la pregunta considerando que está pidiendo "lo mejor" y citando "WCF 4, ASP.NET MVC 2 y WCF REST" – jfar

+0

@Alex gracias. @jfar intenté hacerlo más específico para ti. Solo quiero que alguien me diga si han batallado mucho en cualquiera de las rutas y que ha descubierto que es perfecto o defectuoso – BritishDeveloper

Respuesta

20

De hecho, he implementado o estoy usando las 3 opciones publicadas, así que daré mi opinión. Ahora que ha aclarado lo que busca un poco, es más fácil responder.

OData

OData es ideal para aplicaciones internas cuando:

  1. Usted es el servidor y el cliente.
  2. Está utilizando Entity Framework.
  3. No utiliza herencia en sus modelos y no espera consultar subcolecciones.

Odata es increíble porque puede usar IQueryable en el lado del cliente. Esto viene con algunas limitaciones sin embargo. Los dos fuera de mi cabeza incluyen que trabajar con modelos heredados es un poco incómodo y usted can't do nested collections.

También hay un problema con no saber realmente qué es supported LINQ capabilities are.

Recomendaría OData si realmente necesita una capa de servicio y solo espera hacer simples operaciones CRUD con ellos. El principal problema con cada problema OData resulta en una pared dura a la que no se puede mover a veces. El código de consumidor del cliente es realmente la mejor parte y si no está usando C# para consumir, probablemente no valga la pena.

También sin utilizar la compatibilidad de metadatos automáticos de EF, estará escribiendo la misma cantidad de código para ajustarse a un esquema que sus consumidores pueden o no disfrutar escribiendo. Si bien hay un contenedor Rails para OData, todo esto es relativamente nuevo. No veo a OData en la naturaleza, además de socios de MS realmente grandes.

La autenticación y el filtrado OData también son bastante básicos. Escribirá mucho código relacionado con permisos usted mismo si necesita limitar los datos. Si alguna vez desea que SELECT * FROM TABLE esté limitado por permisos, prepárese para escribir un código incómodo.

MVC 2

MVC es bastante bueno para hacer un servicio REST. Tiene soporte verbal y return JSONResult es tan fácil como puede ser. El único inconveniente potencial es que usted codifica una gran parte del manejo del error y todos sus modelos de vista deben heredar de una clase base que muestra códigos de estado y mensajes de error.

También es posible que desee ajustar un poco el motor de visualización dependiendo de qué tan elegante o convención desee que sean las respuestas de sus mensajes. El GRAN beneficio de MVC es muy extensible y puedes hacer casi lo que quieras. Estoy interesado en combinar formularios/llamadas ajax/servicios de descanso en la misma acción de controlador. Implementar una vez, obtener tres sabores de la misma operación. Sería difícil hacer que MVC se quede corto porque puede ser retorcido para hacer casi cualquier cosa que necesite.

Una gran ventaja para un servicio de MVC es que puede introducir una pequeña interfaz de usuario de administrador en una aplicación que se implementa junto con el servicio. Muy útil para no tener dos sitios para implementar.

WCF REST

Así que sólo estoy usando resto WCF en una capacidad muy limitada y parece ... bien ... He utilizado WCF durante 3 años y siempre estoy satisfecho con cuán frustrantemente complejo es extenderlo. Al igual que ODATA, se encontrará con clases selladas y cavernas no extensibles de funcionalidad muy rápido si se sale de los caminos trillados. Esto está en contraste directo con la cantidad de extensibilidad de MVC.

El otro problema es su construcción en la parte superior de WCF y toda la locura que conlleva. Siempre he dicho que se requiere un doctorado para usar WCF de manera efectiva. Rick Strahl tenía un buen artículo sobre el pain points of WCF REST. No estoy seguro de si las cosas han cambiado, pero vale la pena leerlas.

WCF REST se ve realmente prometedor y lo estoy usando en este momento, simplemente no sé lo suficiente como para recomendarlo.

Puntos principales

  1. Si no conoce a sus consumidores entonces yo supongo que no conoce su API. No construyas un servicio hasta que tengas un caso de uso y puedas codificarlo.

  2. MVC es el más extensible y si está familiarizado con la forma en que funcionan las cosas bajo las sábanas, probablemente sea mejor que implementar algo de MS difícil de extender como OData y WCF.

  3. Todos los "grandes" como Facebook, Amazon, PayPal, Ebay tienen API que no se ajustan a ningún patrón o esquema conocido como OData. Su servicio REST es realmente lo que usted hace de él. Esto se relaciona con el # 1. Concéntrese en hacer que sea fácil para un consumidor trabajar primero.

+0

Recibes un voto positivo solo para "Punto principal n.º 1" :-) Muchas personas intentan diseñar una API basándose en la idea de que solo están exponiendo datos y no es necesario comprender cómo se usará. –

+0

excelente respuesta gracias. re: # 1 los servicios de datos del sitio web están escritos y entregados a través de un sitio web asp.net mvc. Acabo de recibir un nuevo requisito de "necesitamos una API para una aplicación de iPhone y tal vez otras cosas en el futuro". Sé muy poco sobre esta área, ¡gracias por la ayuda! – BritishDeveloper

+0

+1 jfar - muy buen resumen allí. He usado wcf (http) y mvc para esta tarea. me gusta la autenticación que es tan fácil en wcf, mientras que en mvc hay mucho más dolor. si esto se resolvió en una implementación de mvc-rest que se encargó de la autenticación, entonces creo que sería mi plataforma preferida para todos nuestros servicios de descanso. tal como están las cosas, todavía tenemos requisitos que solo WCF por el momento puede cumplir (en lo que respecta a la seguridad). –

1

He utilizado la plantilla de la aplicación WCF Rest Service disponible en el Visual Studio Extension Manager con mucho éxito. Si estás buscando comenzar rápido, es allí donde iría.

1

Si su proyecto se basa en un ORM Framework o puede contener todos sus datos en colecciones de memoria, OData es el camino a seguir. Si no (es decir, obtiene sus datos a través de procedimientos almacenados o algo similar) vaya a WCF HTTP Services (WCF REST) ​​

OData es realmente prometedor y tiene una gran flexibilidad construida sobre la interfaz IQueryable. En realidad, es algo así como RESTful LINQ. Sin embargo, a menos que tenga algún ORM debajo, tendrá que implementar el material IQueryable, que es casi como implementar un ORM. En este punto, será mejor que utilice los servicios de WCF HTTP de nivel inferior que le brindan más control y puede configurar sus recursos de la manera que desee. Las bibliotecas de los clientes no serán tan potentes, pero no esperan que el servicio implemente todos los operadores de consultas.

7

Antes de tomar una decisión, tenga en cuenta que el soporte HTTP/REST en WCF está en proceso de cambio significativo. Ver http://wcf.codeplex.com/. Habrá una gran cantidad de compatibilidad con versiones anteriores, pero la nueva biblioteca es una re-escritura completa desde la perspectiva de HTTP y WCF.

También tenga en cuenta que OData, aunque es útil para un subconjunto específico de aplicaciones, no es un marco REST de propósito general.

Si necesita algo .net, ahora, y realmente desea hacer el REST, mire a OpenRasta. Si solo quiere hacer REST porque tiene un buen buzz de marketing, ASP.NET MVC probablemente sea lo suficientemente bueno para usted. Si solo estás en etapas experimentales, seguiré mirando las nuevas bibliotecas de WCF.

12

Deberías echar un vistazo a OpenRasta. Es un marco centrado en los recursos explícitamente diseñado para implementar arquitecturas RESTful en .NET, y ofrece un fuerte soporte para cosas como negociación de contenido HTTP y autenticación resumida. El enfoque de OpenRasta es que en lugar de implementar su API en términos de verbos (acciones), su API debe definirse en términos de recursos (que típicamente se correlacionarán estrechamente con su modelo de entidad API) y códecs, que proporcionan serialización desacoplada/representación de esos recursos como XML, JSON, HTML o cualquier otro formato de contenido que su API necesite admitir.

Es de código abierto, escrito completamente en .NET, incluye soporte integrado para IoC e inyección de dependencia (así es como muchos de ellos están conectados entre sí de forma interna), y se distribuye bajo la licencia de MIT.

La versión 2.0 se ha mantenido estable durante un tiempo y se está utilizando en varios lugares, sobre todo en Huddle.

En mi opinión, el fuerte enfoque de OpenRasta en los recursos significa que está mucho más cerca de la visión original de Roy Fielding para la arquitectura RESTful que muchos de los frameworks web/HTTP "multi-propósito", incluyendo WCF y ASP.NET MVC.

+1

Mi experiencia es que asignar recursos a entidades es una mala idea. He tenido mucho más éxito tratando recursos como ViewModels o DTOs. –

+0

Ah, eso es lo que quise decir con "modelo de entidad API" en lugar de "modelo de dominio" ... tienes toda la razón, simplemente no lo expliqué terriblemente bien. –

Cuestiones relacionadas