TokenauthentifiziererToken Authenticator

Dieses Beispiel veranschaulicht das Implementieren eines benutzerdefinierten Tokenauthentifizierers.This sample demonstrates how to implement a custom token authenticator. Ein Tokenauthentifizierer in Windows Communication Foundation (WCF) Dient zum Überprüfen des Tokens, die mit der Nachricht verwendete prüft, ob es in sich selbst konsistent und Authentifizieren der Identität mit dem Token zugeordnet.A token authenticator in Windows Communication Foundation (WCF) is used for validating the token used with the message, verifying that it is self-consistent, and authenticating the identity associated with the token.

Benutzerdefinierte Tokenauthentifizierer sind in einer Vielzahl von Fällen nützlich, z. B.:Custom token authenticators are useful in a variety of cases, such as:

  • Wenn Sie den einem Token zugeordneten Standardauthentifizierungsmechanismus überschreiben möchten.When you want to override the default authentication mechanism associated with a token.

  • Wenn Sie ein benutzerdefiniertes Token erstellen.When you are building a custom token.

Dieses Beispiel zeigt Folgendes:This sample demonstrates the following:

  • Wie sich ein Client mithilfe eines Benutzername/Kennwort-Paars authentifizieren kann.How a client can authenticate using a username/password pair.

  • Wie der Server die Clientanmeldeinformationen mit einem benutzerdefinierten Tokenauthentifizierer überprüfen kann.How the server can validate the client credentials using a custom token authenticator.

  • Der WCF-Dienstcode wie sich mit dem benutzerdefinierten Tokenauthentifizierer verknüpft.How the WCF service code ties in with the custom token authenticator.

  • Wie der Server mit dem X.509-Zertifikat des Servers authentifiziert werden kann.How the server can be authenticated using the server's X.509 certificate.

Dieses Beispiel zeigt auch, wie die Identität des Aufrufers nach dem benutzerdefinierten tokenauthentifizierungsprozess WCF zugänglich ist.This sample also shows how the caller's identity is accessible from WCF after the custom token authentication process.

Der Dienst macht einen einzelnen Endpunkt zur Kommunikation mit dem Dienst verfügbar, der mit der App.conf-Konfigurationsdatei definiert wird.The service exposes a single endpoint for communicating with the service, defined using the App.config configuration file. Der Endpunkt besteht aus einer Adresse, einer Bindung und einem Vertrag.The endpoint consists of an address, a binding, and a contract. Die Bindung wird mit einem Standard-wsHttpBinding konfiguriert, wobei der Sicherheitsmodus auf "Nachricht" festgelegt ist. Dies ist der Standardmodus von wsHttpBinding.The binding is configured with a standard wsHttpBinding, with the security mode set to message - the default mode of the wsHttpBinding. In diesem Beispiel wird das Standard-wsHttpBinding auf die Verwendung der Clientbenutzernamenauthentifizierung festgelegt.This sample sets the standard wsHttpBinding to use client username authentication. Außerdem konfiguriert der Dienst das Dienstzertifikat mit serviceCredentials-Verhalten.The service also configures the service certificate using serviceCredentials behavior. Mit dem securityCredentials-Verhalten können Sie ein Dienstzertifikat angeben.The securityCredentials behavior allows you to specify a service certificate. Ein Dienstzertifikat wird von einem Client verwendet, um den Dienst zu authentifizieren und Nachrichtenschutz bereitzustellen.A service certificate is used by a client to authenticate the service and provide message protection. Die folgende Konfiguration verweist auf das Zertifikat localhost, das während des Beispielsetups installiert wird, wie im folgenden Setup beschrieben.The following configuration references the localhost certificate installed during the sample setup as described in the following setup instructions.

<system.serviceModel>  
    <services>  
      <service   
          name="Microsoft.ServiceModel.Samples.CalculatorService"  
          behaviorConfiguration="CalculatorServiceBehavior">  
        <host>  
          <baseAddresses>  
            <!-- configure base address provided by host -->  
            <add baseAddress ="http://localhost:8000/servicemodelsamples/service" />  
          </baseAddresses>  
        </host>  
        <!-- use base address provided by host -->  
        <endpoint address=""  
                  binding="wsHttpBinding"  
                  bindingConfiguration="Binding1"   
                  contract="Microsoft.ServiceModel.Samples.ICalculator" />  
      </service>  
    </services>  

    <bindings>  
      <wsHttpBinding>  
        <binding name="Binding1">  
          <security mode="Message">  
            <message clientCredentialType="UserName" />  
          </security>  
        </binding>  
      </wsHttpBinding>  
    </bindings>  

    <behaviors>  
      <serviceBehaviors>  
        <behavior name="CalculatorServiceBehavior">  
          <serviceDebug includeExceptionDetailInFaults="False" />  
          <!--   
          The serviceCredentials behavior allows one to define a service certificate.  
          A service certificate is used by a client to authenticate the service and provide message protection.  
          This configuration references the "localhost" certificate installed during the setup instructions.  
....        -->  
          <serviceCredentials>  
            <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />  
          </serviceCredentials>  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  

  </system.serviceModel>  

Die Clientendpunktkonfiguration besteht aus einem Konfigurationsnamen, einer absoluten Adresse für den Dienstendpunkt, der Bindung und dem Vertrag.The client endpoint configuration consists of a configuration name, an absolute address for the service endpoint, the binding, and the contract. Die Clientbindung wird mit dem entsprechenden Mode und clientCredentialType konfiguriert.The client binding is configured with the appropriate Mode and clientCredentialType.

<system.serviceModel>  
    <client>  
      <endpoint name=""  
                address="http://localhost:8000/servicemodelsamples/service"   
                binding="wsHttpBinding"   
                bindingConfiguration="Binding1"   
                contract="Microsoft.ServiceModel.Samples.ICalculator">  
      </endpoint>  
    </client>  

    <bindings>  
      <wsHttpBinding>  
        <binding name="Binding1">  
          <security mode="Message">  
            <message clientCredentialType="UserName" />  
          </security>  
        </binding>  
      </wsHttpBinding>  
    </bindings>  
  </system.serviceModel>  

Die Clientimplementierung legt den zu verwendenden Benutzernamen und das Kennwort fest.The client implementation sets the user name and password to use.

static void Main()  
{  
     ...  
     client.ClientCredentials.UserNamePassword.UserName = username;  
     client.ClientCredentials.UserNamePassword.Password = password;  
     ...  
}  

Benutzerdefinierter TokenauthentifiziererCustom Token Authenticator

Führen Sie die folgenden Schritte aus, um einen benutzerdefinierten Tokenauthentifizierer zu erstellen:Use the following steps to create a custom token authenticator:

  1. Erstellen Sie einen benutzerdefinierten Tokenauthentifizierer.Write a custom token authenticator.

    Im Beispiel wird ein benutzerdefinierter Tokenauthentifizierer implementiert, der überprüft, ob der Benutzername ein gültiges E-Mail-Format hat.The sample implements a custom token authenticator that validates that the username has a valid email format. Er ermittelt den UserNameSecurityTokenAuthenticator.It derives the UserNameSecurityTokenAuthenticator. Die wichtigste Methode in dieser Klasse ist ValidateUserNamePasswordCore(String, String).The most important method in this class is ValidateUserNamePasswordCore(String, String). In dieser Methode überprüft der Authentifizierer das Format des Benutzernamens und kontrolliert, ob der Hostname von einer nicht autorisierten Domäne stammt.In this method, the authenticator validates the format of the username and also that the host name is not from a rogue domain. Wenn beide Bedingungen erfüllt sind, gibt er eine schreibgeschützte Auflistung von IAuthorizationPolicy-Instanzen zurück, mit der Ansprüche bereitgestellt werden, die die Informationen im Benutzernamentoken darstellen.If both conditions are met, then it returns a read-only collection of IAuthorizationPolicy instances that is then used to provide claims that represent the information stored inside the username token.

    protected override ReadOnlyCollection<IAuthorizationPolicy> ValidateUserNamePasswordCore(string userName, string password)  
    {  
        if (!ValidateUserNameFormat(userName))  
            throw new SecurityTokenValidationException("Incorrect UserName format");  
    
        ClaimSet claimSet = new DefaultClaimSet(ClaimSet.System, new Claim(ClaimTypes.Name, userName, Rights.PossessProperty));  
        List<IIdentity> identities = new List<IIdentity>(1);  
        identities.Add(new GenericIdentity(userName));  
        List<IAuthorizationPolicy> policies = new List<IAuthorizationPolicy>(1);  
        policies.Add(new UnconditionalPolicy(ClaimSet.System, claimSet, DateTime.MaxValue.ToUniversalTime(), identities));  
        return policies.AsReadOnly();  
    }  
    
  2. Geben Sie eine Autorisierungsrichtlinie an, die vom benutzerdefinierten Tokenauthentifizierer zurückgegeben wird.Provide an authorization policy that is returned by custom token authenticator.

    Dieses Beispiel enthält seine eigene Implementierung von IAuthorizationPolicy, die als UnconditionalPolicy bezeichnet wird und Sätze von Ansprüchen und Identitäten zurückgibt, die in ihrem Konstruktor an sie übergeben wurden.This sample provides its own implementation of IAuthorizationPolicy called UnconditionalPolicy that returns set of claims and identities that were passed to it in its constructor.

    class UnconditionalPolicy : IAuthorizationPolicy  
    {  
        String id = Guid.NewGuid().ToString();  
        ClaimSet issuer;  
        ClaimSet issuance;  
        DateTime expirationTime;  
        IList<IIdentity> identities;  
    
        public UnconditionalPolicy(ClaimSet issuer, ClaimSet issuance, DateTime expirationTime, IList<IIdentity> identities)  
        {  
            if (issuer == null)  
                throw new ArgumentNullException("issuer");  
            if (issuance == null)  
                throw new ArgumentNullException("issuance");  
    
            this.issuer = issuer;  
            this.issuance = issuance;  
            this.identities = identities;  
            this.expirationTime = expirationTime;  
        }  
    
        public string Id  
        {  
            get { return this.id; }  
        }  
    
        public ClaimSet Issuer  
        {  
            get { return this.issuer; }  
        }  
    
        public DateTime ExpirationTime  
        {  
            get { return this.expirationTime; }  
        }  
    
        public bool Evaluate(EvaluationContext evaluationContext, ref object state)  
        {  
            evaluationContext.AddToTarget(this, this.issuance);  
    
            if (this.identities != null)  
            {  
                object value;  
                IList<IIdentity> contextIdentities;  
                if (!evaluationContext.Properties.TryGetValue("Identities", out value))  
                {  
                    contextIdentities = new List<IIdentity>(this.identities.Count);  
                    evaluationContext.Properties.Add("Identities", contextIdentities);  
                }  
                else  
                {  
                    contextIdentities = value as IList<IIdentity>;  
                }  
                foreach (IIdentity identity in this.identities)  
                {  
                    contextIdentities.Add(identity);  
                }  
            }  
    
            evaluationContext.RecordExpirationTime(this.expirationTime);  
            return true;  
        }  
    }  
    
  3. Schreiben Sie den benutzerdefinierten Sicherheitstoken-Manager.Write a custom security token manager.

    Mit dem SecurityTokenManager wird ein SecurityTokenAuthenticator für bestimmte SecurityTokenRequirement-Objekte erstellt, die in der CreateSecurityTokenAuthenticator-Methode an ihn übergeben werden.The SecurityTokenManager is used to create a SecurityTokenAuthenticator for specific SecurityTokenRequirement objects that are passed to it in the CreateSecurityTokenAuthenticator method. Der Sicherheitstoken-Manager dient außerdem zum Erstellen von Tokenanbietern und Token-Serialisierungsprogrammen. Diese Vorgänge werden in diesem Beispiel jedoch nicht behandelt.The security token manager is also used to create token providers and token serializers, but those are not covered by this sample. In diesem Beispiel erbt der benutzerdefinierte Sicherheitstoken-Manager aus der Klasse ServiceCredentialsSecurityTokenManager und überschreibt die Methode CreateSecurityTokenAuthenticator, um benutzerdefinierte Benutzernamen-Tokenauthentifizierer zurückzugeben, wenn die übergebenen Tokenanforderungen angeben, dass der Benutzernamenauthentifizierer angefordert wird.In this sample, the custom security token manager inherits from ServiceCredentialsSecurityTokenManager class and overrides the CreateSecurityTokenAuthenticator method to return custom username token authenticator when the passed token requirements indicate that username authenticator is requested.

    public class MySecurityTokenManager : ServiceCredentialsSecurityTokenManager  
    {  
        MyUserNameCredential myUserNameCredential;  
    
        public MySecurityTokenManager(MyUserNameCredential myUserNameCredential)  
            : base(myUserNameCredential)  
        {  
            this.myUserNameCredential = myUserNameCredential;  
        }  
    
        public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver)  
        {  
            if (tokenRequirement.TokenType ==  SecurityTokenTypes.UserName)  
            {  
                outOfBandTokenResolver = null;  
                return new MyTokenAuthenticator();  
            }  
            else  
            {  
                return base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver);  
            }  
        }  
    }  
    
  4. Erstellen Sie benutzerdefinierte Dienstanmeldeinformationen.Write a custom service credential.

    Die Klasse der Dienstanmeldeinformationen stellt die Anmeldeinformationen dar, die für den Dienst konfiguriert werden, und erstellt einen Sicherheitstoken-Manager, mit dem Tokenauthentifizierer, Tokenanbieter und Token-Serialisierungsprogramme abgerufen werden können.The service credentials class is used to represent the credentials that are configured for the service and creates a security token manager that is used to obtain token authenticators, token providers and token serializers.

    public class MyUserNameCredential : ServiceCredentials  
    {  
    
        public MyUserNameCredential()  
            : base()  
        {  
        }  
    
        protected override ServiceCredentials CloneCore()  
        {  
            return new MyUserNameCredential();  
        }  
    
        public override SecurityTokenManager CreateSecurityTokenManager()  
        {  
            return new MySecurityTokenManager(this);  
        }  
    
    }  
    
  5. Konfigurieren Sie den Dienst für die Verwendung der benutzerdefinierten Dienstanmeldeinformationen.Configure the service to use the custom service credential.

    Damit der Dienst die benutzerdefinierten Dienstanmeldeinformationen verwenden kann, wird die standardmäßige Dienstanmeldeinformationen-Klasse nach dem Abrufen des in den standardmäßigen Dienstanmeldeinformationen vorkonfigurierten Dienstzertifikats gelöscht. Anschließend wird die neue Dienstanmeldeinformationen-Instanz zum Verwenden der vorkonfigurierten Dienstzertifikate konfiguriert und zum Dienstverhalten hinzugefügt.In order for the service to use the custom service credential, we delete the default service credential class after capturing the service certificate that is already preconfigured in the default service credential, and configure the new service credential instance to use the preconfigured service certificates and add this new service credential instance to service behaviors.

    ServiceCredentials sc = serviceHost.Credentials;  
    X509Certificate2 cert = sc.ServiceCertificate.Certificate;  
    MyUserNameCredential serviceCredential = new MyUserNameCredential();  
    serviceCredential.ServiceCertificate.Certificate = cert;  
    serviceHost.Description.Behaviors.Remove((typeof(ServiceCredentials)));  
    serviceHost.Description.Behaviors.Add(serviceCredential);  
    

Um die Informationen zu den Aufrufern anzuzeigen, können Sie PrimaryIdentity verwenden, wie im folgenden Code gezeigt.To display the caller's information, you can use the PrimaryIdentity as shown in the following code. Current enthält Informationen zu den Ansprüchen des aktuellen Aufrufers.The Current contains claims information about the current caller.

static void DisplayIdentityInformation()  
{  
    Console.WriteLine("\t\tSecurity context identity  :  {0}",   
            ServiceSecurityContext.Current.PrimaryIdentity.Name);  
     return;  
}  

Wenn Sie das Beispiel ausführen, werden die Anforderungen und Antworten für den Vorgang im Clientkonsolenfenster angezeigt.When you run the sample, the operation requests and responses are displayed in the client console window. Drücken Sie im Clientfenster die EINGABETASTE, um den Client zu schließen.Press ENTER in the client window to shut down the client.

SetupbatchdateiSetup Batch File

Mit der in diesem Beispiel enthaltenen Batchdatei Setup.bat können Sie den Server mit relevanten Zertifikaten zum Ausführen einer selbst gehosteten Anwendung konfigurieren, die serverzertifikatbasierte Sicherheit erfordert.The Setup.bat batch file included with this sample allows you to configure the server with relevant certificates to run a self-hosted application that requires server certificate based security. Diese Batchdatei muss angepasst werden, wenn sie computerübergreifend oder in einem nicht gehosteten Szenario verwendet werden soll.This batch file must be modified to work across computers or to work in a non-hosted case.

Nachfolgend erhalten Sie einen kurzen Überblick über die verschiedenen Abschnitte der Batchdateien, damit Sie sie so ändern können, dass sie in der entsprechenden Konfiguration ausgeführt werden.The following provides a brief overview of the different sections of the batch files so that they can be modified to run in appropriate configuration.

  • Erstellen des Serverzertifikats.Creating the server certificate.

    Mit den folgenden Zeilen aus der Batchdatei "Setup.bat" wird das zu verwendende Serverzertifikat erstellt.The following lines from the Setup.bat batch file create the server certificate to be used. Die Variable %SERVER_NAME% gibt den Servernamen an.The %SERVER_NAME% variable specifies the server name. Ändern Sie diese Variable, und geben Sie Ihren eigenen Servernamen an.Change this variable to specify your own server name. Standardmäßig lautet die Variable in dieser Batchdatei localhost.The default in this batch file is localhost.

    echo ************  
    echo Server cert setup starting  
    echo %SERVER_NAME%  
    echo ************  
    echo making server cert  
    echo ************  
    makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe  
    
  • Installieren des Serverzertifikats in den Clientspeicher für vertrauenswürdige Zertifikate.Installing the server certificate into client's trusted certificate store.

    Mit den folgenden Zeilen in der Batchdatei Setup.bat wird das Serverzertifikat in den Clientspeicher für vertrauenswürdige Personen kopiert.The following lines in the Setup.bat batch file copy the server certificate into the client trusted people store. Dieser Schritt ist erforderlich, da von "Makecert.exe" generierte Zertifikate nicht implizit vom Clientsystem als vertrauenswürdig eingestuft werden.This step is required because certificates generated by Makecert.exe are not implicitly trusted by the client system. Wenn Sie bereits über ein Zertifikat verfügen, dass von einem vertrauenswürdigen Clientstammzertifikat abstammt (z. B. ein von Microsoft ausgegebenes Zertifikat), ist dieser Schritt zum Auffüllen des Clientzertifikatspeichers mit dem Serverzertifikat nicht erforderlich.If you already have a certificate that is rooted in a client trusted root certificate—for example, a Microsoft issued certificate—this step of populating the client certificate store with the server certificate is not required.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople  
    

    Hinweis

    Die Setupbatchdatei ist darauf ausgelegt, von einer Windows SDK-Eingabeaufforderung ausgeführt zu werden.The setup batch file is designed to be run from a Windows SDK Command Prompt. Die MSSDK-Umgebungsvariable muss auf das Verzeichnis zeigen, in dem das SDK installiert ist.It requires that the MSSDK environment variable point to the directory where the SDK is installed. Diese Umgebungsvariable wird automatisch innerhalb einer Windows SDK-Eingabeaufforderung festgelegt.This environment variable is automatically set within a Windows SDK Command Prompt.

So richten Sie das Beispiel ein und erstellen esTo set up and build the sample

  1. Stellen Sie sicher, dass Sie ausgeführt haben die Setupprozedur für die Windows Communication Foundation-Beispiele zum einmaligen.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Führen Sie zum Erstellen der Projektmappe die Anweisungen im Erstellen der Windows Communication Foundation-Beispiele.To build the solution, follow the instructions in Building the Windows Communication Foundation Samples.

So führen Sie das Beispiel auf demselben Computer ausTo run the sample on the same computer

  1. Öffnen Sie eine Visual Studio 2012Visual Studio 2012-Eingabeaufforderung mit Administratorrechten, und führen Sie Setup.bat aus dem Beispielinstallationsordner aus.Run Setup.bat from the sample installation folder inside a Visual Studio 2012Visual Studio 2012 command prompt opened with administrator privileges. Hiermit werden alle Zertifikate installiert, die zum Ausführen des Beispiels erforderlich sind.This installs all the certificates required for running the sample.

    Hinweis

    Die Batchdatei Setup.bat ist darauf ausgelegt, an einer Visual Studio 2012Visual Studio 2012-Eingabeaufforderung ausgeführt zu werden.The Setup.bat batch file is designed to be run from a Visual Studio 2012Visual Studio 2012 Command Prompt. Die innerhalb der Visual Studio 2012Visual Studio 2012-Eingabeaufforderung festgelegte PATH-Umgebungsvariable zeigt auf das Verzeichnis mit den ausführbaren Dateien, die für das Skript Setup.bat erforderlich sind.The PATH environment variable set within the Visual Studio 2012Visual Studio 2012 Command Prompt points to the directory that contains executables required by the Setup.bat script.

  2. Starten Sie Service.exe aus dem Ordner \service\bin.Launch service.exe from service\bin.

  3. Starten Sie Client.exe aus dem Ordner \client\bin.Launch client.exe from \client\bin. In der Clientkonsolenanwendung wird Clientaktivität angezeigt.Client activity is displayed on the client console application.

  4. Wenn Client und Dienst nicht miteinander kommunizieren können, finden Sie unter Tipps zur Problembehandlung.If the client and service are not able to communicate, see Troubleshooting Tips.

So führen Sie das Beispiel computerübergreifend ausTo run the sample across computers

  1. Erstellen Sie auf dem Dienstcomputer ein Verzeichnis für die Dienstbinärdateien.Create a directory on the service computer for the service binaries.

  2. Kopieren Sie die Dienstprogrammdateien in das Dienstverzeichnis auf dem Dienstcomputer.Copy the service program files to the service directory on the service computer. Kopieren Sie außerdem die Dateien Setup.bat und Cleanup.bat auf den Dienstcomputer.Also copy the Setup.bat and Cleanup.bat files to the service computer.

  3. Sie benötigen ein Serverzertifikat mit dem Antragstellernamen, das den vollqualifizierten Domänennamen des Computers enthält.You must have a server certificate with the subject name that contains the fully-qualified domain name of the computer. Die Datei App.config des Diensts muss so aktualisiert werden, dass sie diesem neuen Zertifikatnamen entspricht.The service App.config file must be updated to reflect this new certificate name. Erstellen Sie sie mithilfe der Datei Setup.bat, indem Sie die Variable %SERVER_NAME% auf den vollqualifizierten Hostnamen des Computers festlegen, auf dem der Dienst ausgeführt werden soll.You can create one by using the Setup.bat if you set the %SERVER_NAME% variable to fully-qualified host name of the computer on which the service will run. Beachten Sie, dass die Datei setup.bat an einer Visual Studio-Eingabeaufforderung mit Administratorrechten ausgeführt werden muss.Note that the setup.bat file must be run from a Visual Studio command prompt opened with administrator privileges.

  4. Kopieren Sie das Serverzertifikat in den Speicher CurrentUser – TrustedPeople des Clients.Copy the server certificate into the CurrentUser-TrustedPeople store of the client. Sie müssen diesen Schritt nur dann ausführen, wenn das Serverzertifikat von einem Aussteller stammt, der vom Client als vertrauenswürdig eingestuft wurde.You do not need to do this except when the server certificate is issued by a client trusted issuer.

  5. Ändern Sie in der Datei App.config auf dem Dienstcomputer den Wert der Basisadresse, und geben Sie anstelle von localhost einen vollqualifizierten Computernamen an.In the App.config file on the service computer, change the value of the base address to specify a fully-qualified computer name instead of localhost.

  6. Führen Sie auf dem Dienstcomputer service.exe an einer Eingabeaufforderung aus.On the service computer, run service.exe from a command prompt.

  7. Kopieren Sie die Clientprogrammdateien aus dem Ordner \client\bin\ (unterhalb des sprachspezifischen Ordners) auf den Clientcomputer.Copy the client program files from the \client\bin\ folder, under the language-specific folder, to the client computer.

  8. Ändern Sie in der Datei Client.exe.config auf dem Clientcomputer den Wert für die Adresse des Endpunkts, sodass er mit der neuen Adresse Ihres Diensts übereinstimmt.In the Client.exe.config file on the client computer, change the address value of the endpoint to match the new address of your service.

  9. Starten Sie auf dem Clientcomputer Client.exe an einer Eingabeaufforderung.On the client computer, launch Client.exe from a command prompt.

  10. Wenn Client und Dienst nicht miteinander kommunizieren können, finden Sie unter Tipps zur Problembehandlung.If the client and service are not able to communicate, see Troubleshooting Tips.

So stellen Sie den Zustand vor Ausführung des Beispiels wieder herTo clean up after the sample

  1. Führen Sie Cleanup.bat im Beispielordner aus, nachdem Sie das Beispiel fertig ausgeführt haben.Run Cleanup.bat in the samples folder once you have finished running the sample.

Siehe auchSee Also