Frage

Ich habe einen kleinen WCF-Hosting-Engine, die ich, dass ich schreibe dynamisch ServiceHosts erstellen auf der CONFIG-Datei basiert. Die allgemeine Idee ist, damit wir bestehende Dienste entfernen, sowie neue Dienste hinzufügen, zur Laufzeit ohne all unsere Dienste offline bringen zu müssen.

Ich lief in ein Problem Unit-Tests, die dies so einfach sein kann, nicht angibt, wie es klingt. Es scheint, dass nur ein Servicehost für einen bestimmten Endpunkt existieren kann (auch wenn mehrere verschiedene Endpunkte für einen Dienst in einem einzigen Servicehost existieren kann). Dies ist kein Problem, normalerweise jedoch, wenn ein Dienst neu konfiguriert werden muss, wird die ursprüngliche Servicehost der Senkung nicht tatsächlich die Registrierung für diese Endpunkt-Adresse töten. Der Versuch, ein anderen Servicehost, für den gleichen Dienst zu schaffen (was bedeutet, werden die gleichen Endpunkte verwenden) nicht mit folgenden Ausnahme:

System.InvalidOperationException: The ChannelDispatcher at 'net.pipe://localhost/' with contract(s) '"ITestService"' is unable to open its IChannelListener. --->
System.InvalidOperationException: A registration already exists for URI 'net.pipe://localhost/'.

Ich bin Begegnung tatsächlich den Fehler bei der Unit-Tests. Die Tests werden eine Einheit, die Gegenstand einer schließt ganz durch die ServiceHosts und Hosting-Motor so viel wie nur irgend möglich ist. Dann eine weitere Instanz des Hosting-Engine, die die gleichen ServiceHosts wieder für einen anderen Test zu erstellen versucht. Der zweite Test trifft auf den Fehler, der oben. Ich vermute, dass während ServiceHost.Close () aufgerufen wurde, die eigentlich nicht die Service-Host zerstören ... so ist es hängt immer noch um im Speicher. Ich kann nicht sagen, ob der GC ist der alte Service-Hosts Reinigung oder nicht ... das Problem weiterhin besteht, ohne nachdem es weggeht zunächst auftritt (so gut ich in der Lage gewesen, um zu bestimmen ... Ich habe etwa 30 Minuten so weit wartete. )

Meine Konfigurationsdatei für system.serviceModel ist wie folgt:

  <system.serviceModel>
    <services>
      <service name="Campus.Core.ServiceModel.TestServiceStub">
        <endpoint          
          address="net.pipe://localhost"          
          binding="netNamedPipeBinding"           
          contract="Campus.Core.ServiceModel.ITestService"
        />
      </service>
    </services>
  </system.serviceModel>
War es hilfreich?

Lösung

Um eine Antwort auf diese Frage, falls jemand zu schaffen, sonst in das Problem ausgeführt wird. Es stellte sich heraus, tatsächlich zwei Ursachen für dieses Problem zu sein, wie folgt:

1) Während Unit-Tests, wenn eine Ausnahme aufgetreten ist, wäre es in der Regel des Code ausbrechen getestet wird, bevor der Servicehost geschlossen werden kann. Dies ließ die Servicehost an einen bestimmten Endpunkt gebunden. Dies führte zu allen nachfolgenden Tests fehlschlagen, die das gleiche Stück Code ausgeübt. Als ich tat BDD mit subspec und xUnit, einem einzigen Testfall (betrifft in BDD Begriffen) durchgeführte Einzelbehauptung-per-Test und ein einzelner Testfall bis zu einem Dutzend oder mehr Aussagen umfassen könnte.

2) Vorsicht vor dem MEX-Endpunkt. Der Endpunkt MEX kann nur einmal pro Dienst vorhanden. Ursprünglich hatte ich einen http und net.tcp mex Endpunkt erstellt. Dies verursacht ein Problem, aber, wie je nachdem, welche Instanz des MEX-Endpunkt zweiten Betrieb genommen eine Ausnahme ausgelöst hat. Generell, wenn Sie das MEX-Endpunkt verwenden, HTTP ist das nützlichste Protokoll zu verwenden, es sei denn, dass eine physische Infrastruktur Problem ist, so dass Sie verhindern, dass zu tun.

Im Allgemeinen die Close () -Methode bei einem Servicehost Aufruf wird es vollständig lösen, so dass unabhängig von Adressen, die zuvor an seine Endpunkte wieder verwendbar sein, gebunden waren. Manchmal kann Schließung eine Weile dauern, und in seltenen Fällen kann eine Ausnahme ausgelöst werden. Wenn Sie BDD mit subspec tun und nach der Regel der einzigen Behauptung pro Test, eine Ausnahme in einem Test geworfen, die eine ServiceHosts Schließung verhindert wird alle folgenden Tests fehlschlagen.

Andere Tipps

Eine Antwort ist eine Guid an die URL für den Service-Host jedes Mal, wenn Sie ein bis spinnen anhängen, und eine Fabrik Ansatz verwenden, der sowohl die Servicehost Instanzen bis dreht sich und gibt die Client-seitige Kanal, so dass der Kunde weiß, was uRL zu verwenden.

IDesign die InProcFactory Probe verwendet diesen Ansatz, so Sie in der Lage sein können, es zu benutzen, wie sie ist:

http://www.idesign.net/idesign/DesktopDefault aspx? tabindex = 5 & tabid = 11

Beachten Sie, dass Sie mit IDesign Website, um sich registrieren zu werden, die Probe zu downloaden, und sie werden Ihnen die gelegentliche Mitteilung über die Ausbildung und so senden, aber es ist nicht zu viel.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top