2009-07-22 4 views
2

Ich möchte einige grundlegende Anleitung zum Einrichten meiner WCF-Konfiguration. Dies ist meine erste ernsthafte Anstrengung mit WCF (und erste Post auf Stackoverflow).Wie konfiguriere ich mehrere Dienstendpunkte in WCF?

Ich habe eine WCF-Klassenbibliothek (APILibrary), die ich in mein Webprojekt referenzieren. In der wcf-Bibliothek habe ich derzeit zwei Dienste - IAuthService und ITradeService.

Entlang diesen Linien, ich habe drei Fragen:

1) Mein Problem (und den ursprünglichen Grund für diesen Beitrag) ist, dass, wenn ich meine Anwendung kompilieren ich TradeServiceCient zu nennen bin in der Lage, aber nicht AuthServiceClient in meiner Web-App. Letzteres erscheint nicht im Intellisense. Ich habe das Gefühl, dass es mit der Tatsache zu tun hat, dass sie den gleichen Port teilen (und nur ein Endpunkt wurde aufgenommen), aber ich bin offensichtlich unklar.

2) Ich versuche, zwei Service-Endpunkte zur gleichen Zeit (und wahrscheinlich ein paar mehr) während ich entwickeln und testen. Wenn ich zum Staging und zum Hosting übergehe, hat jeder Endpunkt seine eigene Adresse. Bis dahin, wie mache ich das Ich mache das (ich habe das Gefühl, das bezieht sich auf meine Frage oben)?

3) Ich merke in vielen Posts Menschen haben Beispiele für die "Client" und "Server" "system.serviceModel" -Code. Sind diese eindeutigen Dateien oder Tags in der App.config-Datei, die sich in meiner WCF-Bibliothek befindet? Was macht jeder? Derzeit denke ich, ich habe nur die Server-Seite? Hier

ist, was ich habe zur Zeit in meiner App.config-Datei (in meiner WCF Library):

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.web> 
    <compilation debug="true" /> 
    </system.web> 
    <!-- When deploying the service library project, the content of the config file must be added to the host's 
    app.config file. System.Configuration does not support config files for libraries. --> 
    <system.serviceModel> 
    <client /> 
    <services> 
     <service behaviorConfiguration="ApiLibrary.ApiBehavior" name="SpoonSys.Api.Trade.TradeService"> 
     <endpoint address="" binding="wsHttpBinding" contract="SpoonSys.Api.Trade.ITradeService"> 
      <identity> 
      <dns value="localhost:8731" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8731/Design_Time_Addresses/ApiLibrary/Trade/" /> 
      </baseAddresses> 
     </host> 
     </service> 

     <service behaviorConfiguration="ApiLibrary.ApiBehavior" name="SpoonSys.Api.Authentication.AuthService"> 
     <endpoint address="" binding="wsHttpBinding" contract="SpoonSys.Api.Authentication.IAuthService"> 
      <identity> 
      <dns value="localhost:8731" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8731/Design_Time_Addresses/ApiLibrary/Authentication/" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ApiLibrary.ApiBehavior"> 
      <!-- To avoid disclosing metadata information, 
      set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="True"/> 
      <!-- To receive exception details in faults for debugging purposes, 
      set the value below to true. Set to false before deployment 
      to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

Meine Konfiguration ist ASP.NET/Framework 3.5/VS 2008/C#

+0

@marc_s sagt _ "Die andere Frage ist, warum Sie nur einen Endpunkt in Ihrem intellisense sehen können - haben Sie Ihren Client-Proxy für beide Endpunkte erstellt? Da es zwei separate Verträge sind, benötigen Sie zwei separate Client-Proxys Haben Sie Ihren Client-Endpunkt erstellt? Können Sie die Client-Konfiguration auch posten? "_ – Kiquenet

Antwort

4

Ja, In Ihrem Fall haben Sie es nur mit der Serverseite zu tun - Ihre Konfiguration sieht also eigentlich ganz okay aus.

Das einzige, was ich in Ihrer Konfiguration ändern würde, ist die Aufteilung zwischen "baseAddress" und der tatsächlichen Serviceadresse. Sie definieren derzeit die gesamte vollständige Adresse in Ihrer Basisadresse - das widerspricht dem Zweck der Basisadresse. Ich würde es wie so aufgeteilt:

<service name="SpoonSys.Api.Services" 
      behaviorConfiguration="ApiLibrary.ApiBehavior" > 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8731/Design_Time_Addresses/ApiLibrary/" /> 
     </baseAddresses> 
    </host> 
    <endpoint 
     address="Trade" 
     binding="wsHttpBinding" 
     contract="SpoonSys.Api.Trade.ITradeService"> 
     <identity> 
     <dns value="localhost:8731" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 

Auf diese Weise Sie grundsätzlich Ihre beiden Endpunkte in einem kollabieren könnte - die Basisadresse definiert genau das - eine gemeinsame Basis für alle anderen Adressen - während der Endpunkt die Details definiert der vollständigen Adresse:

<service name="SpoonSys.Api.Services" 
      behaviorConfiguration="ApiLibrary.ApiBehavior" > 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8731/Design_Time_Addresses/ApiLibrary/" /> 
     </baseAddresses> 
    </host> 
    <endpoint 
     address="Trade" 
     binding="wsHttpBinding" 
     contract="SpoonSys.Api.Trade.ITradeService"> 
     <identity> 
     <dns value="localhost:8731" /> 
     </identity> 
    </endpoint> 
    <endpoint 
     address="Authentication" 
     binding="wsHttpBinding" 
     contract="SpoonSys.Api.Authentication.IAuthService"> 
     <identity> 
     <dns value="localhost:8731" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 

Dies funktioniert, wenn Sie eine einzelne Service-Klasse „SpoonSys.Api.Services“, die beide dieser Serviceverträge implementiert - das ist völlig in Ordnung und durchaus manchmal nützlich.

Wenn Sie zwei separate Serviceklassen haben müssen, die jeweils eine Schnittstelle implementieren, dann können Sie Ihre Konfiguration nicht so komprimieren - dann müssen Sie die vollständige Konfiguration für zwei separate Serviceklassen in Ihrem verwenden Original Post (was mir gut schien).

Die andere Frage ist, warum Sie nur einen Endpunkt in Ihrem intellisense sehen können - haben Sie Ihren Client-Proxy für beide Endpunkte erstellt? Da es sich um zwei separate Verträge handelt, benötigen Sie zwei separate Client-Proxys. Wie haben Sie Ihren Client-Endpunkt erstellt? Können Sie die Client-Konfiguration auch posten?

Marc

0

Ich habe versucht, die Basisadresse pro Ihren Vorschlag zu verkürzen. Ich bekam dann einen Fehler, wo ein Dienst starten würde, aber nicht der andere. Mir wurde gesagt, dass der Metadaten-Endpunkt bereits verwendet wurde. Ich habe dann versucht, meine Namespaces von SpoonSys.ApiLibrary.Authentication und SpoonSys.ApiLibrary.Trade auf nur SpoonSys.ApiLibary für alle Klassen-Dateien zu ändern. Immer noch - der gleiche Fehler. Als ich zu meiner ursprünglichen Serverkonfiguration zurückkehrte, kompilierte es. Dennoch nimmt das IntelliSense nur einen Dienst auf, und nicht den anderen.

Ich bin mir nicht sicher, was Sie meinen Client-Konfigurationsdatei meinen. Ich habe nichts in Bezug auf WCF in meinem Client-App-Projekt getan (außer die WCF-Klassenbibliothek als Web-Service-Referenz zu portieren). Vielleicht gehe ich hier falsch? Kannst du mir mehr erzählen?

Ich habe eine client.dll im WCF-Editor für jeden Endpunkt bemerkt und die unten Beiträge geschrieben haben:

ENDPUNKT: localhost: 8731/Design_Time_Addresses/Authentifizierung/mex

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.serviceModel> 
     <bindings> 
      <wsHttpBinding> 
       <binding name="WSHttpBinding_ITradeService" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
        allowCookies="false"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <reliableSession ordered="true" inactivityTimeout="00:10:00" 
         enabled="false" /> 
        <security mode="Message"> 
         <transport clientCredentialType="Windows" proxyCredentialType="None" 
          realm="" /> 
         <message clientCredentialType="Windows" negotiateServiceCredential="true" 
          algorithmSuite="Default" establishSecurityContext="true" /> 
        </security> 
       </binding> 
      </wsHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="localhost:8731/Design_Time_Addresses/Trade/" 
       binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ITradeService" 
       contract="ITradeService" name="WSHttpBinding_ITradeService"> 
       <identity> 
        <dns value="localhost:8731" /> 
       </identity> 
      </endpoint> 
     </client> 
    </system.serviceModel> 
</configuration> 

ENDPUNKT: http://localhost:8731/Design_Time_Addresses/Trade/mex

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.serviceModel> 
     <bindings> 
      <wsHttpBinding> 
       <binding name="WSHttpBinding_IAuthService" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
        allowCookies="false"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <reliableSession ordered="true" inactivityTimeout="00:10:00" 
         enabled="false" /> 
        <security mode="Message"> 
         <transport clientCredentialType="Windows" proxyCredentialType="None" 
          realm="" /> 
         <message clientCredentialType="Windows" negotiateServiceCredential="true" 
          algorithmSuite="Default" establishSecurityContext="true" /> 
        </security> 
       </binding> 
      </wsHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="localhost:8731/Design_Time_Addresses/Authentication/" 
       binding="wsHttp binding" bindingConfiguration="WSHttpBinding_IAuthService" 
       contract="IAuthService" name="WSHttpBinding_IAuthService"> 
       <identity> 
        <dns value="localhost:8731" /> 
       </identity> 
      </endpoint> 
     </client> 
    </system.serviceModel> 
</configuration> 

und schließlich, hier ist mein app.Config WIEDER:

PS - Ich bekomme "neue Benutzer können maximal einen Hyperlink veröffentlichen", wenn ich versuche, meine Antwort so zu übermitteln, nahm ich alle "http: //" Referenzen in meinem Beitrag heraus. Es ist kein Codefehler.