2010-02-15 17 views
7

El objetivo es crear un servicio que luego consumiré a través de jQuery y un front-end web basado en estándares, un dispositivo móvil "clientes gordos" y muy probablemente una aplicación de escritorio WPF.Desarrollar un nuevo servicio web RESTful en .NET: ¿por dónde debería comenzar? ASP.NET-MVC, WCF?

Parece que WCF sería una buena opción, pero nunca he construido un servicio RESTful con WCF, por lo que no estoy seguro de por dónde empezar con ese enfoque.

La otra opción en la que estoy pensando es usar ASP.NET MVC, agregar algunas rutas personalizadas, agregar algunas acciones de controlador y usar diferentes vistas para expulsar JSON, xml y otros tipos de devolución.

Este proyecto es principalmente un ejercicio de aprendizaje para mí, y me gustaría pasar más tiempo y hacerlo "bien" para tener una mejor idea de cómo encajan las piezas.

Así que mi pregunta es esta, ¿qué enfoque debo usar para construir este servicio RESTful, y cuáles son algunas ventajas de hacerlo de esa manera?

Respuesta

8

Normalmente, diría que WCF para cualquier clase de serice alojado, pero en el caso específico de los servicios RESTful que usan JSON como mecanismo de serialización, prefiero ASP.NET MVC (que me referiré a ASP.NET para el resto de esta respuesta).

Una de las primeras razones se debe al mecanismo de enrutamiento. En WCF, tienes que definirlo en el contrato, lo cual está muy bien, pero si tienes que hacer cambios rápidos en tu enrutamiento, desde mi punto de vista, es mucho más fácil hacerlo usando el mecanismo de enrutamiento en ASP. RED.

Además, hasta el punto anterior, si tiene múltiples servicios expuestos en múltiples interfaces en WCF, es difícil obtener una imagen completa de su estructura de URL (que es importante), mientras que en ASP.NET usted (normalmente) todas las asignaciones de ruta en un solo lugar.

Lo segundo acerca de ASP.NET es que tendrá acceso a todos los objetos intrínsecos por los que ASP.NET es conocido (Solicitud, Respuesta, Servidor, etc., etc.), que es esencial cuando se expone un Punto final específico de HTTP (que es lo que está creando). De acuerdo, puede usar muchas de estas mismas cosas en WCF, pero tiene que decirle específicamente a WCF que lo está haciendo y luego diseñar sus servicios con eso en mente.

Por último, a través de la experiencia personal, he encontrado que la DataContractJsonSerializer no maneja DateTimeOffset valores demasiado bien, y es del tipo que se debe utilizar más de DateTime cuando se trabaja con un servicio (por encima de cualquier criterio de valoración) que puede ser llamado por personas en múltiples zonas horarias. En ASP.NET, hay un serializador diferente que puede usar, o si lo desea, puede crear su propio ActionResult que utiliza un serializador personalizado para usted. Yo personalmente prefiero el JSON.Net serializer.

Una de las cosas buenas del serializador JSON.Net y ASP.NET que me gusta es que puedes usar tipos anónimos con ella, si eres inteligente. Si crea un método genérico estático en un tipo no genérico que luego delega en un tipo genérico interno, puede usar la inferencia de tipo para utilizar fácilmente los tipos anónimos para sus valores de retorno serializados (suponiendo que son únicos, por supuesto, si tener una estructura que se devuelve constantemente, debe definirla y usarla).

También se debe mencionar que no tiene que descontar completamente WCF si desarrolla un servicio RESTful. Si está presionando un ATOM o fuente de RSS de su servicio, las clases en el espacio de nombres System.ServiceModel.Syndication de masiva ayudan en la construcción y serialización de esas fuentes.Crear una subclase simple de la clase ActionResult para tomar una instancia de SyndicationFeed y luego serializarla en la secuencia de salida cuando se ejecuta ActionResult es bastante simple.

+1

que dan cuenta de su relación a la pregunta original, pero, ¿podría entrar en más detalles sobre DateTimeOffset y los problemas que ha visto con la serialización de JSON? – Nate

+0

@Nate: recomendaría hacer una pregunta por separado; prueba las diferencias que te ves a ti mismo, y luego publica una pregunta sobre las diferencias donde las ves. – casperOne

1

Personalmente, no estoy loco por implementar servicios REST en WCF. Encuentro el framework asp.net mvc como un modelo de programación más natural para esto.

El implementador de http://atomsite.net/ implementó originalmente la especificación atompub en WCF y reescribió todo el servicio utilizando asp.net mvc. Su experiencia se hizo eco de mi comentario anterior de que para un servicio REST puro asp.net mvc es el camino a seguir.

La única excepción sería si quería exponer potencialmente un servicio de una manera relajada y sin descanso. O si estuviera exponiendo un servicio WCF existente a través de REST.

4

Aquí hay una idea que puede ayudarlo a tomar una decisión entre ASP.NET MVC y WCF. En los escenarios que describes, ¿esperas necesitar usar un protocolo que no sea HTTP?

WCF está diseñado para ser independiente del protocolo de transporte, por lo que es muy diferente de ASP.NET. Tiene canales y enlaces, mensajes, contratos de servicios, contratos de datos y comportamientos. Proporciona muy poco en materia de orientación cuando se trata de construir aplicaciones distribuidas. Lo que te da es un borrón y cuenta nueva para construir.

ASP.Net MVC es, naturalmente, un marco basado en Http. Se trata de verbos HTTP, tipos de medios, URL, encabezados de respuesta y encabezados de solicitud.

La pregunta es ¿qué modelo está más cerca de lo que intentas construir?

Ahora ha mencionado ReST. Si realmente desea construir sus aplicaciones distribuidas siguiendo las restricciones ReST, sería mejor comenzar con OpenRasta. Te guiará por ese camino.

Usted puede hacer Resto en ASP.Net MVC y puede hacerlo en WCF, pero con esas soluciones, no se caerá en el foso del éxito ;-)

+0

Nunca escuché hablar de OpenRasta, ¿tiene alguna información adicional al respecto? Además, HTTP y/o HTTPS serán el único protocolo utilizado en esto, ya que desarrollaré "clientes" en una amplia gama de plataformas. – Nate

+0

Encontrará el proyecto principal aquí http://trac.caffeine-it.com/openrasta/ serialseb es el desarrollador principal del proyecto y colaborador frecuente aquí. Si miran Mix10, la charla sobre OpenRasta es la única en la categoría REST http://live.visitmix.com/Sessions#/tags/REST –

+0

Para un proyecto realmente simple, sería openrasta overkill vs. algo como asp .net mvc? Ya soy bastante comfertable con asp.net mvc y WCF, y no estoy seguro de que aprender un framework/toolkit totalmente nuevo sea ventajoso para mí en este momento. ¿Pensamientos? – Nate

Cuestiones relacionadas