2009-06-24 6 views
2

Kann ein REST (WCF) -Dienst so konfiguriert werden, dass er als STA anstelle von MTA ausgeführt wird?Ausführen von REST/WCF als STA anstelle von MTA für COM

Dieser Ansatz ist erforderlich, um ältere COM-Objekte auszuführen. Um ASMX-Webdienste so zu konfigurieren, dass sie als STA anstelle von MTA ausgeführt werden, gibt es eine Problemumgehung, die mithilfe eines HTTPHandlers den Webdienst zur Ausführung als STA erzwingt.

Ein Artikel von Jeff Prosise, http://msdn.microsoft.com/en-us/magazine/cc163544.aspx, Details der Problemumgehung und wie man es anwendet. Das Anwenden desselben HTTPHandlers auf einen REST-basierten WCF-Dienst (unter Verwendung von Neuen ADO.NET-Datenservice erstellen in Visual Studio) erzeugt einen Fehler an dem Punkt, an dem die WebServiceHandlerFactory aufgerufen wird (der HTTPContext, die URL usw. wird übergeben). .

Der Handler funktioniert für ASMX-Webdienste, und ich bin in der Lage, eine Webmethode hinzuzufügen, die das Threading-Modell als STA zurückgibt. Aber selbst nach der Einstellung von ASPCompatibility (sowohl in web.config als auch auf Klassenebene) erzeugt der benutzerdefinierte HTTPHandler immer einen Fehler am selben Punkt, wenn er versucht, einen REST-Service zu verwenden. Ich habe keine Endpunkte konfiguriert, da ich einen einfachen REST-Service mit einigen "Service Operator" -Methoden verwende. Der Fehler ist:

Kann Objekt des Typs ‚System.Web.Compilation.BuildResultCustomString‘ eingeben ‚System.Web.Compilation.BuildResultCompiledType‘ gießen.

+0

Die MSDN-Verknüpfung ist effektiv unterbrochen (es wird auf eine allgemeine MSDN Magazine-Seite umgeleitet). –

Antwort

0

Ich komme aus der entgegengesetzten Richtung (versuchen, meine STA COM in MTA zu konvertieren), und ich glaube, es ist automatisch, wenn Sie die COM in Ihrer Dienstinstanz instanziieren und Ihre COM ist eine ordnungsgemäße STA mit der richtigen Registrierung Eintrag. So funktionierte es für mich, und ich habe mindestens 5 Wrapper für dieses COM erstellt.

Wenn Sie Threads manuell erstellen, möchten Sie möglicherweise SetApartmentState verwenden.