2011-02-16 20 views
10

Hola tengo un servicio de wcf simple como este, con un método de prueba que simplemente duerme durante 20 segundos y devuelve un valor. Escribí una página de prueba que usa jquery para llamarla 10 veces seguidas, y parece ejecutarse simultáneamente, con el cliente esperando 20 segundos y luego obteniendo resultados de todos los servicios al mismo tiempo.AspNetCompatibilityRequirements hace que el servicio web de WCF bloquee

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,ConcurrencyMode=ConcurrencyMode.Multiple,UseSynchronizationContext=false)] 
public class AjaxTestWCFService : IAjaxTestWCFService 

Sin embargo si fijo

aspNetCompatibilityEnabled="true" 

en web.config entonces no importa lo que hago, con concurrencymode, usesynchronizationcontext o el modo de contexto ejemplo, o incluso serviceThrottling config, que aparece para ejecutar cada llamada de servicio web de forma secuencial , con lo que tomar 2 minutos para las 10 solicitudes de regresar !!

Ahora me doy cuenta de que esto puede deberse a la sesión, pero al menos en los servicios ASMX pude establecer la habilitación en falso. Y, de hecho, mi método de servicio web no está utilizando sesión en absoluto. Entonces, quizás se pregunte por qué usar aspNetCompatibilityEnabled en absoluto. Porque quiero usar la suplantación de ASP.net y la autenticación de formularios.

incluso puse

[ServiceContract(SessionMode=SessionMode.NotAllowed)] 

Así que mi pregunta es, ¿es por diseño y cómo puedo permitir solicitudes de servicios web concurrentes con la compatibilidad ASP.net permitido?

Respuesta

6

Esto es por diseño de ASP.NET sí mismo - marque concurrent requests and session state. Una vez que enciende AspNetCompatibilityEnabled siempre tiene que lidiar con eso, no lo intenté pero espero que la única opción sea cerrar la sesión en el archivo de configuración.

<configuration> 
    <system.web> 
    <sessionState mode="Off" /> 
    </system.web> 
</configuration> 

Pero aún así su prueba probablemente no sea muy realista. Cuando AspNetCompatibilityEnabled está desactivado, se ejecutará en paralelo, pero supongo que si ejecuta la página desde otra computadora, no podrá ejecutar más de dos solicitudes en paralelo. La razón es que, por defecto, se usa la conexión persistente HTTP. Por especificación HTTP solo se pueden abrir 2 conexiones persistentes HTTP en el mismo servidor = solo se pueden ejecutar dos solicitudes paralelas (last paragraph before chapter 8.2). Windows sigue estas recomendaciones.

Editar:

Este thread on MSDN forum disusses la misma cuestión. También proporciona alguna solución.

+0

Actualmente IE 8. Safari y FireFox pueden ejecutar más de 2 solicitudes al mismo servidor. Creo que IE 8 es 6. Y sí, confirmé desde otra máquina. – Tuviah

+0

en lo que respecta a desactivar el estado de sesión no es una opción. Uso la sesión en otros lugares para contar usuarios concurrentes. ¿Por qué los servicios web de ASMX tienen la capacidad de activar y desactivar el estado de la sesión por método y los servicios de WCF no lo hacen? – Tuviah

+0

@Tuviah: a menos que tenga control total sobre los navegadores utilizados por sus clientes, debe contar con dos solicitudes paralelas. Por ejemplo, estoy trabajando en compañía con 10k computadoras donde IE6 es estándar y nos estamos moviendo a IE7 ... (sí, eso es una actualización, jajaja). –

Cuestiones relacionadas