Las llamadas WCF han pasado el tiempo de espera si crea el host de servicio WCF dentro de ASP.NET controlador MVC
Este artículo le ayuda a resolver el problema de Windows Communication Foundation (WCF) en el que las llamadas se han quedado fuera si crea el host de servicio WCF dentro de ASP.NET controlador de vista de modelo (MVC).
Versión del producto original: Windows Communication Foundation 4.0, Microsoft .NET Framework 4.0
Número KB original: 2621732
Síntomas
El tiempo de espera de la llamada WCF si el host de servicio se creó dentro ASP.NET controlador MVC.
Causa
Se trata de un escenario de interbloqueo, que la llamada de cliente WCF se origina ASP.NET controlador MVC. Además, el host de servicio WCF se creó en el ASP.NET MVC también.
Este es un código de ejemplo, que puede reproducir este problema. Supongamos que la aplicación se hospeda en https://localhost/wcfselfhostinmvc . A continuación, las solicitudes https://mywebsite/wcfselfhostinmvc/home/index para que siempre se desaseme el tiempo de espera.
public class HomeController : Controller
{
private static ServiceHost SvcHost = null;
public ActionResult Index()
{
//Create the service host
if (null == SvcHost)
{
SvcHost = new ServiceHost(typeof(HelloWorld));
SvcHost.Open();
}
//Create the Client
EndpointAddress address = new EndpointAddress("net.pipe://localhost/WCFSelfHostInMVC/HelloWorld");
NetNamedPipeBinding binding = new NetNamedPipeBinding();
binding.Security.Mode = NetNamedPipeSecurityMode.None;
ChannelFactory<IHelloWorld> factory = new
ChannelFactory<IHelloWorld>(binding, address);
IHelloWorld channel = factory.CreateChannel();
//This call always timed out
ViewBag.Message = channel.DoWork();
return View();
}
Esto se debe a un interbloqueo relacionado con AspNetSynchronizationContext el objeto. El subproceso de cliente WCF (subproceso MVC) estaba manteniendo el bloqueo de ya que es una solicitud ASP.NET y estaba esperando la respuesta de AspNetSynchronizationContext la llamada de servicio WCF. Sin embargo, el subproceso de servicio WCF requiere el bloqueo para el AspNetSynchronizationContext fin de procesar la solicitud WCF.
Los motivos por los que WCF usa AspNetSynchronizationContext son:
- Se
ServiceBehaviorAttribute UseSynchronizationContextestablece en true (de forma predeterminada). - El host de servicio WCF se crea en ASP.NET contexto (a medida que el código se degrada, se creó dentro del controlador MCV).
Solución
Hay varias soluciones alternativas disponibles:
Establecer
ServiceBehaviorAttribute UseSynchronizationContexten false.Crear el host de servicio en el Application_Start.
Uso de . SVC para crear o activar el host de servicio.