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:
- Der
ServiceBehaviorAttribute UseSynchronizationContextWert ist auf "true" festgelegt (standardmäßig). - 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 UseSynchronizationContextauf false.Erstellen des Diensthosts im Application_Start.
Mit. SVC-Datei zum Erstellen/Aktivieren des Diensthosts.