2010-03-03 21 views
13

Tengo un servicio WCF alojado en una aplicación web (IIS). Necesito exponer 1 punto final sobre wsHttp y el otro sobre netTcp. Estoy en un entorno IIS7 que me permite alojar servicios no basados ​​en HTTP. De todos modos, cuando navego por el. svc archivo usando un navegador, me sale el error:WCF alojado en una aplicación web y modo de compatibilidad

The service cannot be activated because it does not support ASP.NET compatibility. ASP.NET compatibility is enabled for this application

buscando en Google, me di cuenta de que WCF se ejecuta en dos modos - Mezcla y ASP.NET compatibles. Cuando aplico el atributo

[AspNetCompatibilityRequirements(
     RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

Sin embargo, parece que una vez que aplico este atributo para la ejecución del contrato de servicio, no puedo usar una unión no HTTP.

¿Cómo puedo configurarlo de manera que:

  • puedo soportar puntos terminales que no HTTP
  • puedo alojar el servicio en una aplicación Web
  • no lo creo múltiples servicios con una Red PEA compatibilidad activada y la otra apagada
+0

¿Está utilizando una función de ASP.NET? ¿Si es así, Cuál? ¿Se puede eliminar? –

+0

Aún no - hasta ahora (No estoy seguro de si usaría sesión o contexto en el futuro). ¿Estás diciendo que si no uso ninguna característica de asp.net, debería poder desconectar la compatibilidad con AspNet y aún así alojarla en un host web? – DotnetDude

+0

¿por qué no expone el servicio usando un servicio de Windows? Creo que primero y segundo son imposibles de hacer a menos que use WAS. –

Respuesta

4

Supongo que tiene activada la configuración de compatibilidad ASP.NET para su aplicación IIS. This link parece estar relacionado.

Le sugiero que desactive el modo de compatibilidad ASP.NET. He ejecutado los puntos finales net.tcp y basicHttp desde la misma aplicación en IIS sin problema.

editar: Este es el cambio de configuración que necesita realizar/verificar (desde el enlace proporcionado). El valor debe cambiarse de 'falso' a 'verdadero'.

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled=”true” /> 
</system.serviceModel> 
+0

Si desactivo la compatibilidad ASP.NET, aparece el "error de activación" (mensaje en mi publicación original) – DotnetDude

+0

En su publicación original, está hablando de agregar un atributo al servicio que determina si el servicio puede o no ejecutarse en AspCompatibilityMode. Estoy hablando de configurar la aplicación, en su configuración web, para que la aplicación no use AspCompatibilityMode en absoluto (y su atributo sea redundante). Mi respuesta ha sido editada. –

1

Por favor, intente configurar multipleSiteBindingsEnabled para ser verdad en el ServiceHostingEnvironment. No soy un experto en WCF, pero después de responder a la pregunta y leer un montón de sitios, creo que tendría sentido, ya que está utilizando extremos de servicio TCP y HTTP.

Espero que esto ayude.

7

Aquí están sucediendo muchas cosas. En primer lugar, a menos que realmente esté usando una característica de ASP.net específicamente, NO debe usar el modo de compatibilidad. Para apagar eso, seguir la sugerencia de Kirk, y también eliminar esta línea de su código: no se requiere

[AspNetCompatibilityRequirements(
     RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

modo de compatibilidad sólo para albergar un servicio HTTP, es sólo si desea utilizar las características de ASP.NET que no están en WCF (o necesitan trasladar un servicio anterior de asmx a WCF sin cambiar otro código).

El segundo problema es alojar un enlace no HTTP utilizando IIS. Eso solo funciona en IIS 7, y solo usa WAS. La compatibilidad de ASP.net NO funcionará con un enlace que no sea HTTP, porque ASP.net requiere HTTP.

Lo que intenta hacer es imposible siempre que el modo de compatibilidad esté habilitado. Retíralo, y entonces las cosas deberían funcionar.

0

Encontré este problema también.
es el resultado de la migración de un código nuevo que hacía referencia al Sistema.Espacio de nombres web pero en realidad no lo requería, en un proyecto de WCF existente. eliminando aquellos usando declaraciones resolvió el problema para mí.

Esperaba tener que rastrear el código que requería ese espacio de nombres, pero tuve suerte.

Cuestiones relacionadas