locked
WCF Router mit Zertifikaten und MessageInspektor RRS feed

  • Frage

  • Hallo,

    ich habe einen WCF Client und Service, welche per Nachrichten- oder Transportsicherheit jeweils mit Zertifikaten verschlüsselt kommunizieren.

    Jeder Nachricht wird mit einem Behavior ein zusätzlicher Header hinzugefügt, in dem z.B. Sitzungsdaten enthalten sind.

    Jetzt möchte ich einen Router bauen (siehe hier: http://bebugsblog.blogspot.com/2010/02/wcf-routing-service.html )
    der aufgrund der Sitzungsdaten im Header ein Routing vornehmen kann und gleichzeitig bei Ausfall eines Dienstes einen anderen anbieten kann.
    (Falls es hier Links gibt, die mir Hinweise zum auslesen meines Headers für das korrekte Routing bieten - bitte mit angeben! Danke!)

    Ich habe inzw. nach dem obigen Beispiel einen Router implementiert, habe aber nun das Problem, dass der Router scheinbar nicht mit dem Dienst kommunizieren kann. Anfragen vom Client kommen aber an - dies kann ich durch eine Konsolenausgabe bei der ReceiveRequest-Methode des Routers und auch bei BeforeSendRequest sehen. Es kommt aber nichts beim Service an.

    Ich habe keine Idee, woran es noch liegen könnte da ich die Einstellungen für die direkte Kommunikation zwischen Client und Service kopiert habe und auch keinen logischen Fehler finde..


    BITTE HELFEN!

    Fehlermeldung: {"The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error."}

    Hier die App.Config des Routers:

      <system.serviceModel>
       <bindings>
        <netTcpBinding>
         <binding name="SecNetTcpBinding">
          <security mode="Message">
           <transport clientCredentialType="Certificate" />
           <message clientCredentialType="Certificate" />
          </security>
         </binding>
        </netTcpBinding>
       </bindings>
    
       <extensions>
        <behaviorExtensions>
         <add name="Injection" type="Company.ServiceModel.ServerMessageInspector, Company.ServiceModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
        </behaviorExtensions>
       </extensions>
       <services>
        <service behaviorConfiguration="CertRoutingData" name="System.ServiceModel.Routing.RoutingService">
         <endpoint behaviorConfiguration="InjectionBehavior" binding="netTcpBinding"
          bindingConfiguration="SecNetTcpBinding" name="reqReplyEndpoint"
          contract="System.ServiceModel.Routing.IRequestReplyRouter">
          <identity>
           <dns value="WcfServer" />
          </identity>
         </endpoint>
         <endpoint address="mex" binding="mexTcpBinding" name="reqReplyEndpointMetadata"
          contract="IMetadataExchange" />
         <host>
          <baseAddresses>
           <add baseAddress="net.tcp://appserver:9999/Company/Application" />
          </baseAddresses>
         </host>
        </service>
       </services>
       <behaviors>
        <endpointBehaviors>
         <behavior name="CertInjectionBehavior">
          <Injection />
          <clientCredentials>
           <clientCertificate findValue="WcfClient" storeName="TrustedPeople"
            x509FindType="FindBySubjectName" />
           <serviceCertificate>
            <defaultCertificate findValue="WcfServer" x509FindType="FindBySubjectName" />
            <authentication certificateValidationMode="PeerTrust" />
           </serviceCertificate>
          </clientCredentials>
         </behavior>
         <behavior name="InjectionBehavior">
          <Injection />
         </behavior>
        </endpointBehaviors>
        <serviceBehaviors>
         <behavior name="CertRoutingData">
          <routing routeOnHeadersOnly="true" filterTableName="FilterTable1" />
          <serviceMetadata httpGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceCredentials>
           <clientCertificate>
            <authentication certificateValidationMode="PeerTrust" />
           </clientCertificate>
           <serviceCertificate findValue="WcfServer" storeLocation="CurrentUser"
            x509FindType="FindBySubjectName" />
           <peer>
            <messageSenderAuthentication certificateValidationMode="PeerTrust" />
           </peer>
           <issuedTokenAuthentication certificateValidationMode="PeerTrust" />
          </serviceCredentials>
         </behavior>
        </serviceBehaviors>
       </behaviors>
       <client>
        <endpoint address="net.tcp://appserver:8888/Company/Application/UserService"
         behaviorConfiguration="CertInjectionBehavior" binding="netTcpBinding"
         bindingConfiguration="SecNetTcpBinding" contract="*" name="OutputEndpoint">
         <identity>
          <dns value="WcfServer" />
         </identity>
        </endpoint>
       </client>
       <routing>
        <filters>
         <filter name="MyFilter" filterType="MatchAll" />
        </filters>
        <filterTables>
         <filterTable name="FilterTable1">
          <add filterName="MyFilter" endpointName="OutputEndpoint" />
         </filterTable>
        </filterTables>
       </routing>
      </system.serviceModel>


    und hier gekürzt die des Services:
     <system.serviceModel>
    
      <services>
       <service behaviorConfiguration="serviceBehavior" name="Application.Services.System.SessionService">
        <endpoint address="System\SessionService" behaviorConfiguration="InjectionBehavior"
         binding="netTcpBinding" bindingConfiguration="netTcpBinding"
         name="NetTcpSessionService" contract="Application.Services.Contracts.System.ISessionServiceContract"
         listenUriMode="Explicit">
         <identity>
          <dns value="WcfServer" />
         </identity>
        </endpoint>
        <endpoint address="System/SessionService/Metadata" binding="mexTcpBinding"
         bindingConfiguration="" name="NetTcpSessionServiceMetadata"
         contract="IMetadataExchange" />
        <host>
         <baseAddresses>
          <add baseAddress="net.tcp://AppServer:8888/Company/Application" />
          <add baseAddress="http://AppServer:8080//Company/Application/SessionService" />
         </baseAddresses>
        </host>
       </service>
       <service behaviorConfiguration="serviceBehavior" name="Application.Services.MasterData.UserService">
        <endpoint address="MasterData/UserService" behaviorConfiguration="InjectionBehavior"
         binding="netTcpBinding" bindingConfiguration="netTcpBinding"
         name="NetTcpUserService" contract="Application.Services.Contracts.MasterData.IUserServiceContract"
         listenUriMode="Explicit">
         <identity>
          <dns value="WcfServer" />
         </identity>
        </endpoint>
        <endpoint address="MasterData/UserService/Metadata" binding="mexTcpBinding"
         bindingConfiguration="" name="NetTcpUserServiceMetadata" contract="IMetadataExchange" />
        <host>
         <baseAddresses>
          <add baseAddress="net.tcp://AppServer:8888/Company/Application" />
          <add baseAddress="http://AppServer:8080//Company/Application/UserService" />
         </baseAddresses>
        </host>
       </service>
      </services>
    
      <behaviors>
       <serviceBehaviors>
        <behavior name="serviceBehavior">
         <serviceMetadata httpGetEnabled="true"/>
         <serviceDebug includeExceptionDetailInFaults="true"/>
         <serviceCredentials>
          <clientCertificate>
           <authentication certificateValidationMode="PeerTrust"/>
          </clientCertificate>
          <serviceCertificate findValue="WcfServer" storeLocation="CurrentUser" x509FindType="FindBySubjectName"/>
          <peer>
           <messageSenderAuthentication certificateValidationMode="PeerTrust"/>
          </peer>
          <issuedTokenAuthentication certificateValidationMode="PeerTrust"/>
         </serviceCredentials>
        </behavior>
       </serviceBehaviors>
       <endpointBehaviors>
        <behavior name="InjectionBehavior">
         <Injection/>
        </behavior>
       </endpointBehaviors>
      </behaviors>
    
      <bindings>
       <netTcpBinding>
        <binding name="netTcpBinding" receiveTimeout="00:05:00">
         <reliableSession inactivityTimeout="00:05:00" />
         <security mode="Message">
          <transport clientCredentialType="Certificate" />
          <message clientCredentialType="Certificate" />
         </security>
        </binding>
       </netTcpBinding>
      </bindings>
    
      <extensions>
       <behaviorExtensions>
        <add name="Injection" type="Company.ServiceModel.ServerMessageInspector, Company.ServiceModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
       </behaviorExtensions>
      </extensions>
    
     </system.serviceModel> 


    Für jede Hilfe dankbar:
    Jens
    Donnerstag, 20. Mai 2010 11:37

Alle Antworten

  • Es sei hinzugefügt, dass ich bevor ich eine <backuplist> einfüge zunächst eine einfache Weiterleitung (hier von Port 9999 auf Port 8888) zum laufen bringen möchte.

     

    Peer Trust habe ich bereits auf None umgestellt, ohne eine Veränderung.

    Es sind  alle Zertifikate sowohl beim Service, als auch beim Router und Client vorhanden. Eine direkte Kommunikation funktioniert und der Router erhält auch die Anfrage vom Client.

    Leider sendet der Router zwar eine Nachricht, schickt aber auch sofort eine Antwort an den Client und die Fehlermeldung wird dort ausgegeben..

     

    LG

    Jens

    Donnerstag, 20. Mai 2010 11:42