Beim Erstellen des WCF-Diensthosts innerhalb ASP.NET MVC-Controllers ist ein Timeout für wcf-Aufrufe aufgetreten.

Dieser Artikel hilft Ihnen, das Windows Communication Foundation (WCF)-Problem zu beheben, bei dem Anrufe beim Erstellen des WCF-Diensthosts innerhalb ASP.NET Model View Controller (MVC)-Controller zeitüberschreitungen.

Ursprüngliche Produktversion:   Windows Communication Foundation 4.0, Microsoft .NET Framework 4.0
Ursprüngliche KB-Nummer:   2621732

Problembeschreibung

Beim WCF-Aufruf ist ein Timeout aufgetreten, wenn der Diensthost innerhalb ASP.NET MVC-Controllers erstellt wurde.

Ursache

Dies ist ein Deadlockszenario, das der WCF-Clientaufruf von ASP.NET MVC-Controller stammt. Und der WCF-Diensthost wurde auch im ASP.NET MVC-Controller erstellt.

Hier ist ein Beispielcode, der dieses Problem reproduzieren kann. Angenommen, die Anwendung wurde unter https://localhost/wcfselfhostinmvc gehostet. Die Anforderungen für immer einen https://mywebsite/wcfselfhostinmvc/home/index Timeout.

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();  
}  

Dies ist auf einen Deadlock im Zusammenhang mit dem AspNetSynchronizationContext Objekt zurückzuführen. Der WCF-Clientthread (MVC-Thread) hält die Sperre, AspNetSynchronizationContext da es sich um eine ASP.NET Anforderung handelt, und wartete auf die Antwort des WCF-Dienstaufrufs. Der WCF-Dienstthread erfordert jedoch eine Sperre für AspNetSynchronizationContext die, um die WCF-Anforderung zu verarbeiten.

Wcf verwendet die AspNetSynchronizationContext folgenden Gründe:

  1. Der ServiceBehaviorAttribute UseSynchronizationContext Wert ist auf "true" festgelegt (standardmäßig).
  2. Der WCF-Diensthost wird unter ASP.NET Kontext erstellt (wie der Code demoed, wurde er innerhalb des MCV-Controllers erstellt.)

Lösung

Es stehen mehrere Problemumgehungen zur Verfügung:

  • Einstellung ServiceBehaviorAttribute UseSynchronizationContext auf false.

  • Erstellen des Diensthosts im Application_Start.

  • Mit. SVC-Datei zum Erstellen/Aktivieren des Diensthosts.

Weitere Informationen