Configurando servicios WCF, Maximum array length quota (16384) has been exceeded

Nov 20 2010

El problema es sencillo de explicar, su solución me tomó horas y horas de leer blogs, y hablar con dos amigos. Puede ser simple pero lo complejo es poder poner todas las partes en su lugar.

El Error

He creado una solución de ejemplo. La solución son dos proyectos: un WCF Service normal y una aplicación Windows Forms. El propósito: subir un archivo desde el cliente hasta el servicio, y ya; El error,

The formatter threw an exception while trying to deserialize the message: Error in deserializing body of request message for operation ‘CrawlResponse’. The maximum array length quota (16384) has been exceeded while reading XML data. This quota may be increased by changing the MaxArrayLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader.

Y aqui empieza uno a padecer un poco. Existen miles de soluciones en internet, blogs, artículos, comentarios, pies de página, etc. Todos indican una que otra cosa. En medio de mi desespero por no poder entender o implementar dichas soluciones veía como todo el mundo agradecía enormemente la ayuda de esos posts y yo seguía elevando improperios al aire en contra del fatídico número 16384.

Así que escribo este post para evitarme dolores de cabeza futuros, y de paso para tratar de explicar qué hay que hacer para solucionar el error en menos tiempo que volverlo a decir. Finalmente, uno “simplemente” debe hacer lo siguiente:

La Solución

Cuando la excepción indica que debemos modificar el valor de MaxArrayLength del archivo de configuración, en verdad nos manda a dos sitios diferentes. Al config del proyecto que tiene el servicio WCF y al config del proyecto cliente. Lo interesnte es que en VS2010 cuando creamos un servicio WCF en un proyecto, no se genera ningún código de configuración en el proyecto servidor. En versiones anteriores sí se generaba y era más fácil sincronizar ambos puntos de la conexión.

En el servidor

Completamos la configuración del servicio en el config creando un nuevo behavior para nuestro servicio

<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="FileTransferBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>

Luego creamos el binding así:

<basicHttpBinding>
   <binding
     name="BigHttpBinding"
     maxBufferSize="20971520"
     maxBufferPoolSize="20971520"
     maxReceivedMessageSize="20971520"
     transferMode="Buffered">
   <readerQuotas
     maxDepth="64"
     maxStringContentLength="20971520"
     maxArrayLength="20971520"
     maxBytesPerRead="4096"
     maxNameTableCharCount="32768" />
   </binding>
</basicHttpBinding>

Los valores que deben usar en los atributos deben estar de acuerdo a las necesidades de su servicio y del negocio. En este caso, el ejemplo era subir un archivo, digamos de hasta 20Mb. Inicialmente conuno de 32K ya aparecía la excepción.

Finalmente configuramos el endpoint del servicio en el servidor.

<services>
   <service behaviorConfiguration="FileTransferBehavior" name="Filetransfer.Service1">
     <endpoint
       bindingConfiguration="BigHttpBinding"
       name="BasicHttp"
       address=""
       binding="basicHttpBinding"
       contract="Filetransfer.IService1">
     </endpoint>
   </service>
</services>

Donde Filetransfer.IService1 y Filetransfer.Service1 son el nombre de la interfaz del servicio y la clase que implementa el servicio respectivamente, con su namespace.

Resumiendo, hemos creado un behavior que no quita ni pone mucho en términos de configuración del servicio en el servidor. Creamos un binding personalizado del tipo basicHttpBinding que tiene una configuración que permite el envío de mensajes de hasta 20MB a través del servicio y finalmente creamos un endpoint para el servicio cuya configuración de behavior es la que definimos inicialmente y cuya configuración de binding es, en este caso, BigHttpBinding.

Finalmente agregamos la siguiente línea en el config

<system.web>
   <httpRuntime maxRequestLength="20971520"/>
</system.web>

Que sobreescribirá el tamaño máximo de un request al servidor. Debemos curarnos en salud en todo aspecto.

Ahora pasemos al cliente.

Al momento de crear la referencia al servicio, Visual Studio genera un código básico de configuración en el  cliente. Para poder crear la referencia es necesario que el servicio esté funcionando. Se prueba fácil si al ver Servie1.svc en un navegador obtenemos el siguiente resultado:

Prueba del servicio en el navegador

Service.svc

Luego podemos generar la referencia al servicio en nuestra aplicación cliente y modificar la configuración generada, así:

Creamos un endpointBehavior

<system.serviceModel>
  <behaviors>
    <endpointBehaviors>
      <behavior name="LargeObjectBehavior">
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
  </behavior>

Luego un binding tipo httpBinding

<basicHttpBinding>
   <binding
     name="BigHttpBinding"
     maxBufferSize="20971520"
     maxBufferPoolSize="20971520"
     maxReceivedMessageSize="20971520"
     transferMode="Buffered">
   <readerQuotas
     maxDepth="64"
     maxStringContentLength="20971520"
     maxArrayLength="20971520"
     maxBytesPerRead="4096"
     maxNameTableCharCount="32768" />
   </binding>
</basicHttpBinding>

Que es idéntico al que está en el servidor.

Finalmente configuramos el endpoint generado para que use nuestros nuevos binding y behavior.

<client>
   <endpoint
     address="http://localhost:8841/Service1.svc"
     binding="basicHttpBinding"
     bindingConfiguration="BigHttpBinding"
     contract="ServiceReference1.IService1"
     name=""
     behaviorConfiguration="LargeObjectBehavior" />
</client>

Donde ServiceReference1.IService1 es el contrato del servicio generado por el asistente de VS2010.

No hay que olvidar que al actualizar la referencia del servicio es posible que se genere nuevo código y siempre debemos revisar que ambos extremos de la comunicación estén coherentes o vamos a tener problemas. Con esta configuración garantizamos eso, y que los valores de los atributos de los bindings serán propagados a través de nuestra aplicación y sus componentes.

Debo agradecer a @warnov y @jkpelaez por su valiosísimo aporte en la solución de este problema que espero haber explicado con buen detalle.

No responses yet

Permisos para la base de datos de Membership Provider

Oct 29 2010

EXECUTE permission denied on object ‘aspnet_CheckSchemaVersion’, database ‘[MemberShip DataBase]‘, schema ‘dbo’

Esa de arriba es la excepción que me hizo entrar en pánico por 15 minutos. El sitio por fin trabaja con membership provider con un manejo decente de cookies que permiten una experiencia de usuario un poco mejor y más ágil. Porque finalmente todo entra por el usuario.

Hicimos la instalación en ambiente de desarrollo y todo estuvo bien, pasamos a el servidor de pruebas local y Pácatelas! salioesa excepción. No tarde mucho en hallar una solución en los foros de ASP.net pero igual la explico a continuación, no exactamente igual.

Solución

Desde el SQL Manager, entre a suBaseDeDatos – Security – Schemas – dbo; click derecho, propiedades. Seleccione la página de Permissions, click en buscar, busque el usuario con el que se conecta a esa base de datos y click en ok. Seleccione el usuario y otórgele el permiso de execute. Yo por mi parte, sabiendo lo que se hace en ese punto, otroge Select e Insert. ya me dira alguno si esto es peligroso o inutil.

Y listo.

Hasta la próxima línea

No responses yet

Ahora más social

Oct 25 2010

Finalmente tenemos servidor nuevo y muchos plugins para que se conecten como se les antoje, desde Facebook o twitter o con el mismo wordpress.

Empezaré a darle cabida a más gente en este espacio para que se cree una base de conocimientos que nos saque de apuros y nos permita usar nuestra memoria para cosas más interesantes. Vienen muchos posts de muchos temas desde la perspectiva .Net.

Este casi es un post de prueba, el primero desde el servidor nuevo, lean abajo que esto por ahora llega hasta aquí.

No responses yet

Load Balancing, las cargas donde deben estar

Oct 07 2010

Hace días que estaba pendiente de poner cosas nuevas. Eso quiere decir una sola cosa: Vienen nuevos post sobre todo el trabajo que se ha hecho en las últimas semanas con jquery, Expression Web, MongoDB, BaseCamp y Balsamiq. Pronto…

Hoy un tema corto. El balanceo de cargas es un medio dolor de cabeza cuando un sitio sale a producción. Pero qué pasa cuando el sitio es uno. Cuando es uno el que esta metido en una sola cosa todo el día, sentado en una silla mas o menos incomoda, con el brillo de la pantalla en los ojos durante 12 horas, o haciendo cualquier otro trabajo? Bueno, pues uno también merece un balanceo de cargas.

Bogotá es una ciudad ultimamente agresiva con su gente. Es una ciudad en obra negra con miles de frentes de obra, cercada por polisombras verdes limón, inundada de incapaces agentes de policía color verde resaltador y de peores conciudadanos que se creen dueños de Bogotá, pero arrojan papelitos por ahí y se estacionan en dónde se les antoja, y madrean y pelean y fruncen los ceños en los semáforos.

Hace 36 años Bogotá cambió un poquito. Se creó un espacio de convivencia al aire libre por toda la ciudad. Yo empecé a usar la ciclovía cuando era un niño y salia a pasear en mi caballito de acero con los amigos del barrio. Hacíamos el cuadrado de las calles 116-Av Boyacá-Av Eldorado-Carrera Séptima. Hace meses ya no hay ciclovía por la avenida Eldorado, está en obra y por la magnitud de la misma vemos con pesar que será muy difícil volver a transitarla los domingos entre perros de marca y patinadoras exóticas. Hoy me levanté con la noticia de que por las mismas obras, la ciclovía en la carrera séptima será suspendida y me volvió el temor de que a lo mejor ya no halla más ciclovía por la séptima. Bogotá esta perdiendo ese espacio que sirve para balancear las cargas. Para dejar los computadores y los seminarios y los almuerzos de cocina de oficina a un lado y salir a sentir ese raro viento tibio en la cara, el sabor de las naranjas recién exprimidas, el calorcito en las piernas de los soles como hoy y balancear la rutina.

Por eso me uno a la iniciativa de http://www.lacicloviaserespeta.com/ para que sea trasladada a la carrera novena.

No responses yet

Publicando una aplicación SilverLight en IIS7

Jul 25 2010

Complementando el proceso explicado en el anterior post. Hoy implementamos una aplicación silverlight en nuestro servidor IIS7. y tuvimo el siguiente error : HTTP Error 401.3 – Unauthorized: Access is denied due to an ACL set on the requested resource.

Es la segunda vez con este error. Inicialmente indica que la carpeta física donde se ejecuta la aplicación no tiene acceso habilitado para el usuario IUSR del IIS. Ahora indicaba una cosa distinta que es mejor explicada en el siguiente post de bloggingdeveloper.

No responses yet

Publicando mi primera aplicación ASP.NET con WCF en IIS7

Jul 18 2010

Hoy hice mi primera instalación de una aplicación ASP.NET que consume servicios WCF en IIS 7.0 . Empecé con un proyecto que tenemos en desarrollo y que queremos montar en nuestro servidor para que el cliente pueda ver los avances más rápidamente. Este proyecto usa Silverlight, WCF, ASP.NET y varios componentes de terceros, que en su momento impidieron la instalación.

Decidí entonces hacer un sitio de prueba que además implementa HTTPHandlers para procesar peticiones personalizadas. El sitio es una solución con un proyecto web y un proyecto de servicios WCF estándar. Estándar en cuanto a que lo cree y no lo toqué. Revise lo que hacía por defecto la clase y el contrato que implementaba y lo consumí desde el sitio web. este sitio será muy fácil de implementar por ustedes y me encargaré de ahorrarles uno o dos madrazos.

Una vez probado el sitio, que lo único que hace es llamar con dos botones a cada uno de los métodos del servicio y poner el resultado como texto en un textbox, lo publiqué en el IIS. Lo primero que publiqué fue el proyecto de servicios, luego el sitio.

Para publicar el sitio de servicios, VS2010 ofrece una opción en el menú de contexto del proyecto que dice publish, como si fuera un sitio web tradicional. No entendí absolutamente nada de lo que esa ventana de dialogo me pedía. En casi todas las páginas que visité recomendaban hacerlo muy a pedal. Ensayé la opción de generar un package para instalar la aplicación. Esto genera un archivo ZIP en la carpeta obj/Debug del proyecto. Luego en el IIS creamos una aplicación en el sitio web, con click derecho elegimos la opción deploy/Import Application del menú de contexto. En el asistente buscamos el archivo generado, en paso posterior indicamos la carpeta donde vamos a instalar el servicio y terminamos. Esta forma hace lo que todos los foros hacen a mano y lo que no hace el asistente que abrimos al tratar de publicar el servicio directamente desde VS2010.

Y aqui empezamos a sufrir. Varios errores raros pueden pasar y aunque no recuerdo bien todos, he de daros los que creo que son más comunes.

1. La carpeta donde estas publicando tu sitio y los servicios debe poderse acceder desde el IIS. Para esto basta con agregar al usuario IIS_IUSR en las configuraciones de seguridad de la carpeta. Esto es necesario si el error refiere a la imposibilidad de leer el archivo de configuración *.config.

2. Del application pool debemos verificar lo siguiente. Que la version del framework sea la que en verdad estamos usando. En mi caso es V4.0. Que si es el caso, soporte aplicaciones 32bits, y que maneje el pipeline como lo necesitamos. En este ejemplo, los servicios se publican con una AppPool con pipelines en modo manejado y el sitio con el pipeline en modo integrado.

3. El siguietne error es bueno. Es decir, había batallado mucho para hallar las configuraciones necesarias y el sitio ya corría pero me aparecia el siguiente error de servidor. Could Not Load Type ‘System.ServiceModel.Activation.HttpModule’.

Este error puede ocurrir, entre otros casos, cuando IIS se instala después del FrameWork 4.0, o si después de IIS y .NET 4.0 se ha isntaldo WCF Http Activation Module 3.0.

Confuso, pero fácil de resolver. debemos registrar en el IIS la versión del framework que estamos usando. para esto ejecutamos en linea de comandos lo siguiente:

aspnet_regiis.exe -iru

en la ubicación siguiente

  • 32-bit systems: %SystemRoot%\Microsoft.NET\Framework\v4.0.21006
  • 64-bit systems: %SystemRoot%\Microsoft.NET\Framework64\v4.0.21006

Si estan usando HTTPHandlers. deben adicionalmente configurar las opciones “ISAGI and CGI restrictions” del servidor IIS, desde el adminsitrador del IIS. Para llegar a ellas, se paran en el elemento raiz del árbol de su servidor y en el panel central aparecerá esta opción bajo el título IIS. La opción restriction del framework que están usando debe estar en allowed.

Su sitio ya debería correr, a menos que les salga algo adicional. Para esos casos, revisen el error que les arroja el servidor y consúlten Los Códigos de Estado HTTP de IIS 7.0. Ahí mismo encontrarán enlaces a páginas que me ayudaron a sintetizar mi experiencia de hoy publicando mi primer sitio ASP que consume servicios WCF.

Ahora espero poder publicar el proyecto grande, pero ahí los problemas serán diferentes porque usamos varios componentes de terceros y ellos nos están dando el soporte. Ya les contaré…

No responses yet

la pereza del EntityFramework, por fin explicada

Jul 12 2010

Cuando se usa EntityFramework (EF) en desarrollos .Net, lo que se logra es un manejo muy eficiente y sin código SQL del acceso a datos, sin importar qué fuente sea (SQL, Oracle, ODBC). Se modela la fuente de datos en objetos relacionados y fuertemente tipados, se crean métodos de acceso a esos datos y unas propiedades de navegación. Éstas últimas son las que más confusión causan.

Algun sector cree que esto hace del EntityFramework un modelo de trabajo soso, lento, ineficiente y de altas demandas de recursos. Pero no es así.

Existe una variable del contexto de datos que genera EF llamada LazyLoadingEnabled que le indica al contexto de datos de qué forma debe cargar las propiedades de Navegación. Primero explicaré cómo funcionan y luego indico cómo debe usarse esta variable.

Cuando el EntityFramework modela la fuente de datos no lo hace uno a uno como se hacía hasta hace un tiempo. EF genera unas entidades más versátiles y optimizadas para brindar acceso a los datos relacionados desde un único punto como se muestra en la siguiente imagen de una clase generada por EF.

Entidad EF

Entidad de una tabla país generada por EF

En la imagen anterior vemos claramente que desde la clase País tenemos acceso a Usuario, que es una coleccion de objetos Usuario que contiene a todos los usuario del páis con que se ha instanciado la clase.

La preocupación es obvia: Si mi objeto País tiene una colección de usuarios, su tamaño es grande, el tiempo de carga es grande, la transmisión es lenta y su manejo es complicado. Aquí entra a funcionar la variable de contexto LazyLoadingEnabled.

Si ponemos esa variable en true, el EF va a cargar todas las propiedades de navegación en el momento en que carga los datos básicos de la entidad; si la ponemos el false, sólo se traerán los datos referentes a la tabla País de la fuente de datos. Con esta última opción es que logramos un manejo eficiente y ágil de nuestra aplicación. Debemos por tanto, cargar las variables de operación al momento de necesitarlas. Hay que tener en cuenta que por defecto el EF 4.0 está usando true. Algo que no sucedía en versiones anteriores del EF.

Total, cuando el EF dice LazyLoadingEnabled, no es la pereza del EF sino la pereza del programador.

One response so far

Cómo consumir servicios WCF desde Silverlight en dominios diferentes

Jul 09 2010


Hoy estuvimos consumiendo servicios WCF desde una aplicación silverlight. Todo se hace del mismo modo que cuando consumes servicios WCF desde ASP.NET. Sin embargo, hay que tener en cuenta unas cosas adicionales para evitar el siguiente error al momento de ejecutar el llamado al servicio:

System.ServiceModel.CommunicationException

An error occurred while trying to make a request to URI ‘https://domain/folder/Service.svc’. This could be due to attempting to access a service in a cross-domain way without a proper cross-domain policy in place, or a policy that is unsuitable for SOAP services. You may need to contact the owner of the service to publish a cross-domain policy file and to ensure it allows SOAP-related HTTP headers to be sent. Please see the inner exception for more details.

Esto sucede porque Silverlight implementa algunas medidas de seguridad para evitar que una aplicación desconocida pueda acceder a los servicios que estamos exponiendo. Por defecto, las aplicaciones SilverLight no van a acceder a servicios por fuera de su dominio, éstos rechazarán esos llamados.

Hay dos soluciones fáciles y muy lógicas para eso que las pueden encontrar en el artículo Making a Service Available Across Domain Boundaries en MSDN. Por lo pronto acá te doy una de ellas.

Se usa un archivo llamado clientaccesspolicy.xml en la raiz del proyecto que hospeda los servicios. Ese archivo debe tener la siguiente estructura:

<?xml version="1.0" encoding="utf-8"?>
    <access-policy>
        <cross-domain-access>
            <policy>
                 <allow-from http-request-headers="SOAPAction">
                     <domain uri="*"/>
                 </allow-from>
                 <grant-to>
                     <resource path="/" include-subpaths="true"/>
                 </grant-to>
             </policy>
         </cross-domain-access>
    </access-policy>

Por defecto esta estructura permitirá el acceso desde cualquier dominio. Se debe cambiar la línea

 domain uri="*"/>

por

 domain uri="http://midominio:8888/"/>

Y listo, empieza a probar ya terminar tu proyecto que pa’ntier es tarde.

One response so far

Por qué no hay más emprendimientos usando .NET?

Jul 08 2010

Originalmente publicado el 3. julio 2010 en el blog de Aaron, se hace traducción libre del mismo.

Siempre me ha inquietado por qué una plataforma altamente adoptada y respaldada como .NET no es más visible entre los emprendedores web. Grandes Plataformas y lenguajes open source gozan de alta visibilidad y presencia en la comunidad de startups, desde pilares como Python y PHP a algunas incluso oscuras y especializadas como Clojure y Handoop.

“.NET, por otro lado, es visiblemente ausente de la discusión aunque de hecho es una plataforma más difundida que las demás.

Es como un gran silencio entre la comunidad de desarrolladores que sólo se encierran en sus proyectos sin siquiera ocasionalmente alzar la mano para decir “Aquí hay algo único y bueno que hicimos con esta plataforma, y que nadie había hecho antes”.

Ésto es trágico para la comunidad .Net porque esa falta de sex-appeal aparente no tiene nada que ver con las capacidades reales de la plataforma. Sólo tómense un momento para revisar CodePlex y encontrarán miles de miles de proyectos y ejemplos creativos, de código abierto, hechos con .NET.

Y entre las startup hay un buen número de ellas trabajando sobre .Net, haciéndolo grande, incluyendo la recientemente adquirida por Amazon, Woot. Pero porqué no hay una voz fuerte de .NET en la comunidad de emprendedores? Por qué los desarrolladores de Woot no están trabajando con el equipo de StackOverFlow (también implementada en .NET) para motivar más emprendimientos en el uso extensivo de .NET para crear nuevos productos y servicios?

Y más importante, ¿por qué no hay mas emprendimientos usando .NET?

Todo es cuestión de empresas

He escuchado todo tipo de respuestas ligeras a la pregunta anterior: “que la plataforma es cerrada”, “no hay estándares”, “costos de licenciamiento” y ninguna de ellas pasan la prueba de la objetividad. Sí, esos temas pueden impedir que algunos desarrolladores usen .NET para sus emprendimientos, pero no lo suficiente como para impedir que todos adopten .NET, justamente la plataforma más versatil y fácil de usar con las mejores herramientas y el mejor soporte.1

En Code Camp pude finalmente saber por qué pasa esto. Es la cultura la comunidad .Net en sí misma, no nada especifico a la platafora o a la arquitectura que la soporta.

.NET esta centrada alrededor de las preocupaciones de la empresa – los grandes y ya establecidos negocios en la economía, no las valientes y variables startups. Y cuando digo “cultura” no estoy hablando de las herramientas de desarrollo sino de la mentalidad de los desarrolladores que usan .NET. Hablo de los blogs y otros medios digitales que leen, de las redes en las que colaboran y de los temas que les ocupan.

La mayoría de los desarrolladores que conozco hacen portales para grandes proveedores de la industria médica con miles de empleados, trabajaron en proyectos de legado cuyo tiempo de vida se cuenta en décadas, en equipos con cientos, incluso miles de programadores, y viven en ambientes gobernados por altas gerencias. Éstos son problemas a los que pocos, o ninguno, de los desarrolladores de emprendimientos se ven enfrentados.

Por eso tantas charlas en Code Camp se enfocaron alrededores de metodologías RAD para proyectos internos, estandarización de código, arquitectura empresarial y otros temas que le interesan a los que trabajan en grandes ambientes corporativos.

Y quién puede culpar a Microsoft por atender el mercado empresarial? Ahí esta la plata! Nadie nunca se hizo rico vendiendo herramientas de desarrollo de alta calidad a un puñado de empresas emergentes ávidas de capital.

“Sin embargo, la consecuencia de ese enfoque es que las comunidades emprendedoras y la comunidad .NET no tienen tanto en común como con otras tecnologías.

Como resultado, los desarrolladores emprendedores y fundadores de empresas no conocen .NET y no piensan en ella como una herramienta útil para sus necesidades. Del mismo modo, muchos desarrolladores .NET que quieren trabajar en interesantes empresas emergentes no tienen tantas oportunidades a menos que abandonen .NET por una tecnología más apetecida por los emprendedores”.

Entonces qué es lo que ocupa a los miembros de la comunidad .NET? Ellos se preocupan por dar soporte a sistemas establecidos, construir arquitecturas empresariales que puedan servir a varias dependencias, por grandes sistemas que soporten la operación de procesos internos de las compañías y pr satisfacer a los accionistas de esas empresas.

Los desarrolladores .NET se preocupan por la arquitectura para mantener sistemas

Los emprendedores se ocupan de cosas diferentes. Ellos son sus propios accionistas, se preocupan por la concurrencia, escalabilidad, experiencia de usuario, por soportar muchos clientes y navegadores y por como sus diseños impactara a sus nichos objetivo.

Los emprendedores se preocupan por la arquitectura para mantener productos

Ven la diferencia? .NET es perfectamente capaz de suplir las necesidades de emprendedores y diseñadores de productos, pero muy poca2 de la cultura .NET, literatura y temas de conversación se enfocan en el producto. Al contrario, la mayoría gira alrededor del soporte y necesidades del negocio, no del negocio de hacer productos como tal!

No tiene que ser así

Una cosa debe aclararse aqui. Cualquier plataforma, no solo .NET, puede ser usada para implementar tecnología empresarial y para crear nuevos productos. Las plataformas no siempre definen su uso, éso es trabajo de la gente que trabaja con ellas. Si Microsoft quiere entrar a la escena del emprendimiento, y tengo razones para creer que así es, tienen que hacer un mejor trabajo evangelizando las capacidades de .NET a partir de la creación de nuevos servicios, nuevos productos y nuevos negocios y no solo a partir de la gran empresa.

Las grandes corporaciones y las empresas emergentes no son mutuamente excluyentes, solo son étapas diferentes en la evolucion de un negocio, en éste caso, el desarrollo de software. No hay razón entonces, que justifique a los emprendeores que no consideran a .NET una opción atractiva com punto de inicio para sus nuevos negocios.

The next article I’m going to write on this subject will cover why it’s a good idea for Microsoft to have .NET adopted more readily by the startup community.

1 Entiendan “mejor” como un término subjetivo, pero traten de entender mi punto. No trato de desprestigiar Eclipse, XCode, NetBeans o EMACS, pero siendo justos, Visual Studio se impone ante ellos en cualquier comparación uno a uno.

2 De nuevo, esta es una observación basada en mi experiencia con .NET.  Siempre estoy al acecho de cualquier persona que utilice .NET para un emprendimiento

♣♣♣♣♣

Tras leer éste artículo creí que valía la pena traducirlo y difundirlo en español. Como ustedes saben, Asterysco es otra startup, nada que ver con las startups a las que refiere Aaron o a las que refieren por ejemplo en Campus Party, pero somos una empresa pequeña con ganas de crecer en este mundo del desarrollo de software.

Creo que como dice Aaron una parte del problema es la orientación que ha tenido Microsoft a través de los años, pero mas importante que eso es la orientación de la gente. Pero no tanto por que no se hagan visibles ni porque no compartan. El problema principal es que se siente un poco diferente trabajar con una u otra tecnología. El problema no es desconocimiento sino falta de entusiasmo para desarrollar buenos productos, servicios y sistemas con .NET para los nichos para los que los llamados emprendedores web están trabajando.

En Asterysco creemos que el problema se puede atacar desde la arquitectura. Estamos trabajando fuertemente en lograr arquitecturas que separen la capa de presentación de las capas de negocio y datos. Creemos que hasta las aplicaciones empresariales merecen una buena experiencia de usuario y creemos que es posible hacerlo sobre .NET. Ese tipo de proyectos de investigación en cómo unir lo mejor de ambos mundos es algo que poco o nada se ve en la comunidad de desarrolladores en general. Unos simplemente  ve proyectos empresariales que por debajo son odas a la tecnología y a la seguridad y por fuera son horriblemente concebidos. Este punto particular tiene que ver, en el caso de .NET, en la dificultad inherente al manejo de controles ASP. En otros casos, desconozco, pero me atrevo a decir que es mera negligencia. Afortunadamente ya hay implementaciones de MVC y MVVM para Visual Studio que permiten un manejo mucho mejor de la experiencia de usuario en proyectos de gran envergadura. Justamente esta semana Scott Guthrie ha publicado una serie de artículos excelentes sobre la presentación de WebMatrix, un producto en versión beta para agilizar el desarrollo de nuevas aplicaciones web desde el inicio y usando las más populares herramientas opensource.

Concluimos siempre lo mismo: Sin importar qué tecnología use una empresa o un emprendedor, si se usa la herramienta con cierto rigor académico y profesional, se pueden lograr grandes productos al final.

2 responses so far

Excepciones con Entity Framework: Unable to update the EntitySet

Apr 27 2010

Unable to update the EntitySet ‘UsuariosGrupo’ because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element to support the current operation.

Esto puede no suceder tan a menudo con unas buenas prácticas de diseño de Bases de Datos. Sin embargo en algunas aplicaciones como EA, algunas operaciones no son fáciles de ver y pueden finalmente desembocar en esto.

El escenario es sencillo. En una red social, digamos Facebook, puede usarse una tabla que relaciona Usuarios y Grupos a los que pertenecen. Esta tabla sería la relación n-n de las tablas Usuario y Grupo. Usamos Entity Framework para modelar y crear la capa de acceso de a datos de nuestra aplicación.

Nos damos cuenta que al crear un usuario podemos en un solo paso crear sus grupos por defecto o los que el haya decidido. Lo hacemos y al salvar los cambios en el modelo obtenemos la excepción que encabeza este breve post.

La Solución

En mi caso el problema es que esa tabla intermedia carecía de llaves primarias, que en este caso es una llave compuesta por los dos id de las tablas Usuario y Grupo. Los creé en la BD y regeneré el modelo y todo funcionó como yo esperaba desde el principio.

No responses yet

Older posts »