2008-10-03 16 views
43

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.

Respuesta

21

por the workaround que Microsoft publicó, el the Connect issue presenté para esto, se trata de un problema conocido y no habrá ninguna solución para ello, al menos en la versión actual:

The reason for failing to add a new service item: When adding a new item and updating the configuration file, the system will try to load configuration file, so it will try to search and load the assembly of the cusom extension in this config file. Only in the cases that the assembly is GACed or is located in the same path as vs exe (Program Files\Microsoft Visual Studio 9.0\Common7\IDE), the system can find it. Otherwise, the error dialog will pop up and "add a new item" will fail.

I understand your pain points. Unfortunately we cannot take this change in current release. We will investigate it in later releases and try to provide a better solution then,such as providing a browse dialog to enable customers to specify the path, or better error message to indicate some work around solution, etc...

Can you try the work around in current stage: GAC your custom extension assembly or copy it to "Program Files\Microsoft Visual Studio 9.0\Common7\IDE"?

We will provide the readme to help other customers who may run into the same issue.

Desafortunadamente, parece que No tengo suerte en esto.

+1

También necesité reiniciar VS antes de que la excepción desapareciera. – Dov

+2

en vs2008 hay una "solución", pero ¿alguna solución en VS 2010? – Kiquenet

+1

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.) –

2

¿Tiene una copia de Framework.dll con su comportamiento personalizado en el directorio bin de su proyecto web? Si no, ese es probablemente el problema. Visual Studio está buscando la implementación del comportamiento. Dado que está en la lista en su configuración, no se ve en los otros proyectos; espera encontrar el conjunto en el contenedor.

Dependiendo de cómo esté configurado su proyecto, puede ejecutarse en depuración sin que este ensamble se coloque en el contenedor, aunque VS generalmente lo construye y lo coloca allí. Pero, de nuevo, depende de cómo se configuran las cosas.

De todos modos, tal vez quiera verificar que el ensamblaje esté disponible en el momento del diseño.

+0

El ensamblaje de Framework está disponible en la carpeta bin en el momento del diseño. VS simplemente no parece encontrarlo. –

1

Poner el ensamblaje en el GAC probablemente sea útil, pero agradezco que esta no sea la respuesta que está buscando. No estoy seguro de dónde más buscará VS ensamblajes aparte del GAC y el directorio que contiene devenv.exe.

+0

Desafortunadamente, esa no es realmente una opción. –

4

Intenté esto con un nuevo proyecto solo para asegurarme de que no era su proyecto/configuración específico y tenía exactamente el mismo problema.

Utilizando registros de fusión, parece que el sistema busca SOLAMENTE las extensiones de comportamiento en el directorio IDE (C: \ Archivos de programa \ Microsoft Visual Studio 9.0 \ Common7 \ IDE). Copiar el conjunto a este directorio en un paso posterior a la compilación funciona, pero es feo.

+0

Esto realmente funcionó para mí. La instalación de la DLL en el GAC no resolvió el problema, pero el almacenamiento en Common7 \ IDE \ lo hizo ... ¡¡¡Gracias !!! – Nathan

6

Como un FYI para cualquier persona que tropiece con esto en estos días, una posible solución es COMPLETAMENTE calificar su ensamblaje en su app.config/web.config. EG si tuviera

<system.serviceModel> 
    <extensions> 
     <behaviorExtensions> 
      <add name="clientCredential" type="Client.ClientCredentialElement, Client" /> 
     </behaviorExtensions> 
    </extensions> 

oportunidad - la sustitución de los valores como necassary

<system.serviceModel> 
    <extensions> 
     <behaviorExtensions> 
      <add name="clientCredential" type="Client.ClientCredentialElement, Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </behaviorExtensions> 
    </extensions> 

esta solución particular trabajó para mí.

+5

Observará en mi ejemplo que el tipo ya estaba completamente calificado; el problema no es con la calificación de tipo completo, sino con un defecto aparente en Visual Studio. –

+0

¡Gracias, eso solucionó mi problema! –

+0

debe escribir la etiqueta en una sola línea como se muestra arriba. si lo escribe en varias líneas, no funcionará. espero que esto ayude. – Yeonho

8

acabo de utilizar

[assembly: AssemblyVersion("1.0.*")] 
//[assembly: AssemblyVersion("1.0.0.0")] 
//[assembly: AssemblyFileVersion("1.0.0.0")] 

así que tengo nuevo número de ensamblaje acumulación cada vez.

Pero tenemos

<add name="clientCredential" type="Client.ClientCredentialElement, Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 

donde versión = 1.0.0.0 esto está mal !!!

Así que tienes 2 opciones

  1. Volver a

    //[assembly: AssemblyVersion("1.0.*")] 
    [assembly: AssemblyVersion("1.0.0.0")] Keep it manually. 
    [assembly: AssemblyFileVersion("1.0.0.0")] 
    
  2. cada generación reemplazar manualmente versión = 1.0.0.0 con un número correcto.

+0

El problema no era un problema de versión de ensamblaje, era un defecto en VS2008. Esto puede haberse solucionado en VS2010; no lo he verificado. En VS2010, necesita tener los números de versión del ensamblaje correctos ... pero esa no es una solución para la pregunta que se hace, lo siento. –

+1

@TravisIllig Tengo VS2010 y cuando lo hago EXACTAMENTE he descrito que funciona bien. –

+0

Derecha. En ** VS2010 **. Lo que significa que deben haberlo arreglado en VS2010, y estoy feliz por eso. No tenían esa solución en ** VS2008 **. Gracias por registrarte, sin embargo. –

2

Aquí está la lista de los pasos que funcionó para mí:

  • Instalar DLL en GAC, es decir gacutil/i Bla.DLL
  • Get FQN de DLL, es decir gacutil/l Bla
  • copia resultante FQN en Web.config
  • Agregar nuevo servicio en VS
  • desinstalar DLL desde GAC, es decir gacutil/u Bla

Todos juntos solo.

+0

Como se muestra en la pregunta y se menciona en varios comentarios, el tipo ya estaba completamente calificado. El problema de raíz fue un defecto en VS2008. Además, no necesita instalar en el GAC para obtener el nombre de una asamblea, solo puede usar el reflejo. –

+0

@TravisIllig: Acabo de describir mis propios pasos para hacerlo funcionar en VS2012U1. Mi tipo también estaba completamente calificado y arrojando una excepción. Pero no puse una plataforma = MSIL que no estaba incluida en FQN por Reflector. Luego realicé estos pasos y lo puse en funcionamiento. Pero VS finalmente agregó a 0 líneas Web.config, así que la próxima vez solo copiaré y pegaré un servicio existente. – abatishchev

0

Lo resolví comentando las secciones relevantes en el web.config incluyendo el elemento que usó la extensión personalizada, el elemento y el elemento.

Después de eso, pude agregar un servicio WCF al proyecto, agregar las líneas nuevamente en el web.config y publicar el proyecto.

0

si está utilizando marco 3.5 del Culture = neutral en pequeña no Culture = neutral en CAPITAL

+1

El ejemplo en la pregunta muestra que Culture = neutral está utilizando correctamente la minúscula. –

0

que tenía la clase de extensión dentro del mismo proyecto (DLL) como mi clase de servicio y no se podía conseguir que se trabajo. Una vez que lo moví a otro proyecto y lo hice referencia desde el proyecto de servicio, funcionó. Solo en caso de que alguien más se encuentre con este problema.

Cuestiones relacionadas