Frage

Ich habe eine Baugruppe, die mehr WCF-Dienste erhält, jeder mit seinem eigenen Vertrag. Es funktioniert alles gut. Die Dienstkonfiguration in der app.config für den Dienst sieht wie folgt aus:

<services>
  <service behaviorConfiguration="WcfService.AlyzaServiceBehavior"
    name="Sam.Alyza.WcfService.ServiceWebsites">
    <endpoint address="" binding="netTcpBinding" contract="Sam.Alyza.WcfInterface.IServiceWebsites">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8731/Design_Time_Addresses/SamAlyza/Websites/" />
      </baseAddresses>
    </host>
  </service>
  <service behaviorConfiguration="Sam.Alyza.WcfService.LogReaderServiceBehavior"
    name="Sam.Alyza.WcfService.ServiceLogReader">
    <endpoint address="" binding="netTcpBinding" contract="Sam.Alyza.WcfInterface.IServiceLogReader">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8731/Design_Time_Addresses/SamAlyza/LogReader/" />
      </baseAddresses>
    </host>
  </service>
  <service behaviorConfiguration="Sam.Alyza.WcfService.ServiceSystemverwaltungBehavior"
    name="Sam.Alyza.WcfService.ServiceSystemverwaltung">
    <endpoint address="" binding="netTcpBinding" contract="Sam.Alyza.WcfInterface.IServiceSystemverwaltung">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8731/Design_Time_Addresses/SamAlyza/Systemverwaltung/" />
      </baseAddresses>
    </host>
  </service>
  [...]
</services>

Da ich ein größeres Projekt im Sinn haben, mit mehr Verträge, würde Ich mag einen Weg haben, um die Baseaddress zwischen den verschiedenen Serviceverträge zu teilen.
Wenn dies nur ein Dienst mit unterschiedlichen Verträgen und Endpunkten sei, könnte ich einen ommon Basisadresse festgelegt, aber wie stelle ich eine gemeinsame Basisadresse für mehr als einen Dienst?

Natürlich habe ich etwas ähnliches für den Kunden bräuchten.

War es hilfreich?

Lösung

Sie können alle Aufträge in einer Klasse kombinieren, so dass Sie einen Dienst mit einer Basisadresse und einen (oder mehr) Endpunkt (en) pro Vertrag.

Um zu vermeiden, eine große Klasse-Datei, die können Sie den Teil Schlüsselwort (asuming Sie c # verwenden), um die Klasse über mehrere Dateien aufgeteilt. Jede Datei einen Vertrag implementieren können, das macht die einzelnen Schnittstellen viel einfacher zu halten.

In C ++ können Sie #includes oder Mehrfachvererbung verwenden, aber das eine große Menge an Disziplin bedeuten ...

Ihre Config würde wie folgt aussehen:

<services>
  <service behaviorConfiguration="WcfService.AlyzaServiceBehavior"
    name="Sam.Alyza.WcfService.ServiceAll">
    <endpoint address="Websites/" binding="netTcpBinding" contract="Sam.Alyza.WcfInterface.IServiceWebsites">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="LogReader/" binding="netTcpBinding" contract="Sam.Alyza.WcfInterface.IServiceLogReader">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="Systemverwaltung/" binding="netTcpBinding" contract="Sam.Alyza.WcfInterface.IServiceSystemverwaltung">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:8731/Design_Time_Addresses/SamAlyza/" />
      </baseAddresses>
    </host>
  </service>
</services>

Andere Tipps

Dienste können Baseaddress Werte teilen (einschließlich Port # 's, wenn der Net.Tcp Portfreigabedienst ausgeführt wird). Es ist die Endpunkt-Adressen, die eindeutig sein muss. Beachten Sie in Ihrer Konfigurationsdatei, die die MEX-Endpunkte für jede Servicehost haben eine Adresse von „mex“. Ihre andere Endpunkte haben eine Adresse von leeren String zurück. Wenn Sie eine relative Adresse für einen Endpunkt zu WCF (in der Konfigurationsdatei zumindest) bereitzustellen, wird die Basisadresse vorangestellt. Daher ist die MEX-Endpunkt-Adresse für den LogReader Dienst "net.tcp: // localhost: 8731 / Design_Time_Addresses / SamAlyza / LogReader / mex".

Da eine relative Adresse nicht auf dem Haupt-Service-Endpunkt festgelegt wurde, die Basisadresse des Servicehost ist als die tatsächliche Adresse für den Hauptdienstendpunkt verwendet. Da keine zwei Endpunkte überlappende Uri.AbsolutePath Werte haben kann, würde Ihr Beispiel, das Sie führen, dass die Basisadresse Werte zu glauben, kann nicht mit anderen geteilt werden. Die Servicehost-Klasse, die WCF-Dienste hostet verfügt nicht über einen eingebauten, Endpunkt, während die ServiceEndpoint Klasse eine nuri Eigenschaft hat, dass Sie bieten auf der Grundlage der Einstellungen bevölkert wird.

Wenn Sie die Werte baseaddress in Ihrem Beispiel zu jedem Spiel ändern, solange Sie eindeutige relative Adresse Werte auf den Endpoint-Elementen festgelegt, sollte alles funktionieren. Allerdings scheint es, dass Sie in einige Herausforderungen mit den MEX-Endpunkten ausführen können, da sie alle die Adresse „mex“ im Moment haben. Machen Sie diejenigen einzigartig und Sie sollten in Ordnung sein.

Nun muss ich fragen, sind Sie sicher, dass Sie nicht einfach, diese Dienste wollen einen Namensraum zu teilen, anstatt Basisadressen?

Sie können auch die Basisadressen im Code festgelegt, wenn Sie einen benutzerdefinierten Servicehost verwenden.

In Config können Sie einige App-Einstellung haben:

<configuration>
  <appSettings>
    <add key="BaseAddress" value="http://localhost:1234" />
  </appSettings>
<configuration>

Dann eine benutzerdefinierte Servicehost machen:

public sealed class MyServiceHostFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        var baseAddy = ConfigurationManager.AppSettings["BaseAddress"];
        baseAddresses.Add(new Uri(baseAddy));
        return new ServiceHost(serviceType, baseAddresses);
    }

}

Dann müssen Sie auch Ihre SVC-Dateien ändern, dass die Fabrik verwenden:

<%@ ServiceHost Language="C#" Debug="true" Service="MyApp.MyService" CodeBehind="MyService.svc.cs" Factory="MyApp.MyServiceHostFactory" %>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top