Tengo una solución que contiene dos proyectos. Un proyecto es un Proyecto de Aplicación Web ASP.NET, y uno es una biblioteca de clase. La aplicación web tiene una referencia de proyecto a la biblioteca de clases. Ninguno de estos tiene un nombre fuerte.¿Por qué no se encuentra el tipo de elemento de extensión de comportamiento WCF personalizado?
En la biblioteca de clases, que llamaré "Framework", tengo un comportamiento de punto final (una implementación de IEndpointBehavior) y un elemento de configuración (una clase derivada de BehaviorExtensionsElement). El elemento de configuración es para poder adjuntar el comportamiento del punto final a un servicio a través de la configuración.
En la aplicación web, tengo un servicio WCF habilitado para AJAX. En web.config, tengo el servicio AJAX configurado para usar mi comportamiento personalizado. La sección system.serviceModel de la configuración es bastante estándar y se ve así:
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="MyEndpointBehavior">
<enableWebScript />
<customEndpointBehavior />
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<services>
<service name="WebSite.AjaxService">
<endpoint
address=""
behaviorConfiguration="MyEndpointBehavior"
binding="webHttpBinding"
contract="WebSite.AjaxService" />
</service>
</services>
<extensions>
<behaviorExtensions>
<add
name="customEndpointBehavior"
type="Framework.MyBehaviorExtensionsElement, Framework, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
</extensions>
</system.serviceModel>
En tiempo de ejecución, esto funciona perfectamente. El servicio WCF habilitado para AJAX utiliza correctamente mi comportamiento de punto final configurado personalizado.
El problema es cuando trato de agregar un nuevo servicio AJAX WCF. Si hago Agregar -> Nuevo elemento ... y selecciono "Servicio WCF habilitado para AJAX", puedo ver cómo agrega el archivo .svc y el código subyacente, pero cuando se trata de actualizar el archivo web.config, aparece este error:
The configuration file is not a valid configuration file for WCF Service Library.
The type 'Framework.MyBehaviorExtensionsElement, Framework, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' registered for extension 'customEndpointBehavior' could not be loaded.
Obviamente, la configuración es completamente válida, ya que funciona perfectamente en tiempo de ejecución. Si elimino temporalmente el elemento de la configuración de mi comportamiento y luego agrego el Servicio WCF habilitado para AJAX, todo funciona sin problemas.
Desafortunadamente, en un proyecto más grande en el que tendremos múltiples servicios con varias configuraciones, eliminar todos los comportamientos personalizados temporalmente será propenso a errores. Aunque me doy cuenta de que puedo irme sin utilizar el asistente y hacer todo de forma manual, no todos pueden hacerlo, y sería bueno poder usar el producto tal como estaba destinado a usarse: asistentes y todo.
¿Por qué no se encuentra el tipo de elemento de extensión de comportamiento WCF personalizado?
Actualizaciones/aclaraciones:
- No funciona en tiempo de ejecución, pero no tiempo de diseño.
- El ensamblaje de Framework está en la carpeta bin del proyecto web cuando intento agregar el servicio.
- Si bien podría agregar servicios manualmente ("sin configuración"), necesito la plantilla de elementos listos para usar: ese es el objetivo general de la pregunta.
- Este problema se está viendo en Visual Studio 2008. En VS 2010 esto parece estar resuelto.
I filed this issue on Microsoft Connect y resulta que o bien tienen que poner su elemento de configuración personalizada en la GAC o ponerlo en la carpeta IDE. No lo arreglarán, al menos por ahora. He publicado la solución alternativa que proporcionaron como la "respuesta" a esta pregunta.
También necesité reiniciar VS antes de que la excepción desapareciera. – Dov
en vs2008 hay una "solución", pero ¿alguna solución en VS 2010? – Kiquenet
Parece de otras respuestas a continuación que han resuelto el problema en VS2010. Siempre que mantenga sincronizados los números de versión de su ensamblaje entre el ensamblaje y el archivo de configuración, debería estar bien. (No lo he probado personalmente. YMMV.) –