Vorgehensweise: Sichern eines Dienstes mit Windows-AnmeldeinformationenHow to: Secure a Service with Windows Credentials

In diesem Thema wird gezeigt, wie transportsicherheit für einen Windows Communication Foundation (WCF)-Dienst aktiviert, die befindet sich in einer Windows-Domäne und wird von Clients in der gleichen Domäne aufgerufen wird.This topic shows how to enable transport security on a Windows Communication Foundation (WCF) service that resides in a Windows domain and is called by clients in the same domain. Weitere Informationen zu diesem Szenario finden Sie unter Transportsicherheit mit Windows-Authentifizierung.For more information about this scenario, see Transport Security with Windows Authentication. Eine beispielanwendung finden Sie unter der WSHttpBinding Beispiel.For a sample application, see the WSHttpBinding sample.

In diesem Thema wird vorausgesetzt, dass Sie über eine vorhandene Vertragsschnittstelle verfügen und die Implementierung bereits definiert wurde, da hier auf diese beiden Punkte aufgebaut wird.This topic assumes you have an existing contract interface and implementation already defined, and adds on to that. Sie können auch einen vorhandenen Dienst und Client ändern.You can also modify an existing service and client.

Sie können einen Dienst mit Windows-Anmeldeinformationen vollständig im Code sichern.You can secure a service with Windows credentials completely in code. Alternativ können Sie bei Verwendung einer Konfigurationsdatei einige Teile des Codes weglassen.Alternatively, you can omit some of the code by using a configuration file. In diesem Thema werden beide Methoden gezeigt.This topic shows both ways. Verwenden Sie jedoch stets nur eine der Methoden.Be sure you only use one of the ways, not both.

In den ersten drei Prozeduren wird gezeigt, wie der Dienst unter Verwendung von Code gesichert wird.The first three procedures show how to secure the service using code. Die vierte und fünfte Prozedur zeigen, wie dies mit einer Konfigurationsdatei erreicht wird.The fourth and fifth procedure shows how to do it with a configuration file.

Mithilfe von CodeUsing Code

Den vollständigen Code für Dienst und Client finden Sie im Beispielabschnitt am Ende dieses Themas.The complete code for the service and the client is in the Example section at the end of this topic.

Die erste Prozedur führt Sie durch die Schritte zum Erstellen und Konfigurieren einer WSHttpBinding-Klasse im Code.The first procedure walks through creating and configuring a WSHttpBinding class in code. Für die Bindung wird der HTTP-Transport verwendet.The binding uses the HTTP transport. Die gleiche Bindung wird auf dem Client verwendet.The same binding is used on the client.

So erstellen Sie eine WSHttpBinding, die Windows-Anmeldeinformationen und Nachrichtensicherheit verwendetTo create a WSHttpBinding that uses Windows credentials and message security

  1. Der Code dieser Prozedur wird im Dienstcode des Beispielabschnitts am Anfang der Run-Methode der Test-Klasse eingefügt.This procedure's code is inserted at the beginning of the Run method of the Test class in the service code in the Example section.

  2. Erstellen Sie eine Instanz der WSHttpBinding-Klasse.Create an instance of the WSHttpBinding class.

  3. Legen Sie die Mode-Eigenschaft der WSHttpSecurity-Klasse auf Message fest.Set the Mode property of the WSHttpSecurity class to Message.

  4. Legen Sie die ClientCredentialType-Eigenschaft der MessageSecurityOverHttp-Klasse auf Windows fest.Set the ClientCredentialType property of the MessageSecurityOverHttp class to Windows.

  5. Für diese Prozedur wird der folgende Code verwendet:The code for this procedure is as follows:

    // First procedure:
    // create a WSHttpBinding that uses Windows credentials and message security
    WSHttpBinding myBinding = new WSHttpBinding();
    myBinding.Security.Mode = SecurityMode.Message;
    myBinding.Security.Message.ClientCredentialType =
        MessageCredentialType.Windows;
    
    Dim myBinding As New WSHttpBinding()
    myBinding.Security.Mode = SecurityMode.Message
    myBinding.Security.Message.ClientCredentialType = MessageCredentialType.Windows
    

Verwenden der Bindung in einem DienstUsing the Binding in a Service

Dies ist die zweite Prozedur; in dieser Prozedur wird die Verwendung der Bindung in einem selbst gehosteten Dient veranschaulicht.This is the second procedure, which shows how to use the binding in a self-hosted service. Weitere Informationen zum Hosten von Diensten finden Sie unter Hostingdienste.For more information about hosting services see Hosting Services.

So verwenden Sie eine Bindung in einem DienstTo use a binding in a service
  1. Fügen Sie den Code dieser Prozedur nach dem Code der vorherigen Prozedur ein.Insert this procedure's code after the code from the preceding procedure.

  2. Erstellen Sie eine Type-Variable mit der Bezeichnung contractType, und weisen Sie ihr den Typ der Schnittstelle (ICalculator) zu.Create a Type variable named contractType and assign it the type of the interface (ICalculator). Verwenden Sie bei der Verwendung von Visual Basic die GetType Operator ist; bei Verwendung von c#, verwenden die typeof Schlüsselwort.When using Visual Basic, use the GetType operator; when using C#, use the typeof keyword.

  3. Erstellen Sie eine zweite Type-Variable mit der Bezeichnung serviceType, und weisen Sie ihr den Typ des implementierten Vertrags (Calculator) zu.Create a second Type variable named serviceType and assign it the type of the implemented contract (Calculator).

  4. Erstellen Sie eine Instanz der Uri-Klasse mit der Bezeichnung baseAddress mit der Basisadresse des Dienstes.Create an instance of the Uri class named baseAddress with the base address of the service. Die Basisadresse muss ein Schema haben, das mit dem Transport übereinstimmt.The base address must have a scheme that matches the transport. In diesem Fall das Transportschema HTTP, und die Adresse enthält den speziellen Uniform Resource Identifier (URI) "Localhost" und einen Port number (8036) sowie eine basisendpunktadresse ("ServiceModelSamples /): http://localhost:8036/serviceModelSamples/.In this case, the transport scheme is HTTP, and the address includes the special Uniform Resource Identifier (URI) "localhost" and a port number (8036) as well as a base endpoint address ("serviceModelSamples/): http://localhost:8036/serviceModelSamples/.

  5. Erstellen Sie eine Instanz der ServiceHost-Klasse mit der serviceType-Variablen und der baseAddress-Variablen.Create an instance of the ServiceHost class with the serviceType and baseAddress variables.

  6. Fügen Sie dem Dienst einen Endpunkt mit contractType, Bindung und einem Endpunktnamen (secureCalculator) hinzu.Add an endpoint to the service using the contractType, binding, and an endpoint name (secureCalculator). Ein Client muss beim Initiieren eines Aufrufs zum Dienst die Basisadresse und den Endpunktnamen verketten.A client must concatenate the base address and the endpoint name when initiating a call to the service.

  7. Starten Sie den Dienst, indem Sie die Open-Methode aufrufen.Call the Open method to start the service. Der Code für diese Prozedur wird hier gezeigt:The code for this procedure is shown here:

    // 2nd Procedure:
    // Use the binding in a service
    // Create the Type instances for later use and the URI for 
    // the base address.
    Type contractType = typeof(ICalculator);
    Type serviceType = typeof(Calculator);
    Uri baseAddress = new
        Uri("http://localhost:8036/SecuritySamples/");
    
    // Create the ServiceHost and add an endpoint, then start
    // the service.
    ServiceHost myServiceHost =
        new ServiceHost(serviceType, baseAddress);
    myServiceHost.AddServiceEndpoint
        (contractType, myBinding, "secureCalculator");
    
    //enable metadata
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    smb.HttpGetEnabled = true;
    myServiceHost.Description.Behaviors.Add(smb);
    
    myServiceHost.Open();
    
    ' Create the Type instances for later use and the URI for 
    ' the base address.
    Dim contractType As Type = GetType(ICalculator)
    Dim serviceType As Type = GetType(Calculator)
    Dim baseAddress As New Uri("http://localhost:8036/serviceModelSamples/")
    
    ' Create the ServiceHost and add an endpoint, then start
    ' the service.
    Dim myServiceHost As New ServiceHost(serviceType, baseAddress)
    myServiceHost.AddServiceEndpoint(contractType, myBinding, "secureCalculator")
    myServiceHost.Open()
    

Verwenden der Bindung in einem ClientUsing the Binding in a Client

Diese Prozedur zeigt die Generierung eines Proxys, der mit dem Dienst kommuniziert.This procedure shows how to generate a proxy that communicates with the service. Der Proxy wird generiert, mit der ServiceModel Metadata Utility Tool (Svcutil.exe) die Metadaten des Diensts verwendet, um den Proxy zu erstellen.The proxy is generated with the ServiceModel Metadata Utility Tool (Svcutil.exe) which uses the service metadata to create the proxy.

Durch diese Prozedur wird auch eine Instanz der WSHttpBinding-Klasse erstellt, um mit dem Dienst zu kommunizieren. Anschließend wird der Dienst aufgerufen.This procedure also creates an instance of the WSHttpBinding class to communicate with the service, and then calls the service.

In diesem Beispiel wird zum Erstellen des Clients nur Code verwendet.This example uses only code to create the client. Alternativ können Sie eine Konfigurationsdatei verwenden. Dies wird im Abschnitt nach dieser Prozedur veranschaulicht.As an alternative, you can use a configuration file, which is shown in the section following this procedure.

So verwenden Sie eine Bindung in einem Client mit CodeTo use a binding in a client with code
  1. Verwenden Sie das SvcUtil.exe-Tool, um den Proxycode aus den Metadaten des Diensts zu generieren.Use the SvcUtil.exe tool to generate the proxy code from the service's metadata. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen eines Clients.For more information, see How to: Create a Client. Der generierte Proxycode erbt von der ClientBase<TChannel> -Klasse, die sicherstellt, dass jeder Client die erforderlichen Konstruktoren, Methoden und Eigenschaften für die Kommunikation mit einem WCF-Dienst verfügt.The generated proxy code inherits from the ClientBase<TChannel> class, which ensures that every client has the necessary constructors, methods, and properties to communicate with a WCF service. In diesem Beispiel enthält der generierte Code die CalculatorClient-Klasse, die die ICalculator-Schnittstelle für die Kompatibilität mit dem Dienstcode implementiert.In this example, the generated code includes the CalculatorClient class, which implements the ICalculator interface, enabling compatibility with the service code.

  2. Der Code dieser Prozedur wird am Anfang der Main-Methode des Clientprogramms eingefügt.This procedure's code is inserted at the beginning of the Main method of the client program.

  3. Erstellen Sie eine Instanz der WSHttpBinding-Klasse und legen Sie ihren Sicherheitsmodus auf Message und ihren Clientanmeldeinformationstyp auf Windows fest.Create an instance of the WSHttpBinding class and set its security mode to Message and its client credential type to Windows. Im Beispiel wird die Variable clientBinding genannt.The example names the variable clientBinding.

  4. Erstellen Sie eine Instanz der EndpointAddress-Klasse mit der Bezeichnung serviceAddress.Create an instance of the EndpointAddress class named serviceAddress. Initialisieren Sie die Instanz mit der mit dem Endpunktnamen verketteten Basisadresse.Initialize the instance with the base address concatenated with the endpoint name.

  5. Erstellen Sie eine Instanz der generierten Clientklasse mit der serviceAddress-Variablen und der clientBinding-Variablen.Create an instance of the generated client class with the serviceAddress and the clientBinding variables.

  6. Rufen Sie die Open-Methode auf, wie im folgenden Code dargestellt:Call the Open method, as shown in the following code.

  7. Rufen Sie den Dienst auf, und zeigen Sie die Ergebnisse an.Call the service and display the results.

    // 3rd Procedure:
    //  Creating a binding and using it in a service
    
    // To run using config, comment the following lines, and uncomment out the code
    // following this section
    WSHttpBinding b = new WSHttpBinding(SecurityMode.Message);
    b.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
    
    EndpointAddress ea = new EndpointAddress("Http://localhost:8036/SecuritySamples/secureCalculator");
    CalculatorClient cc = new CalculatorClient(b, ea);
    cc.Open();
    
    // Now call the service and display the results
    // Call the Add service operation.
    double value1 = 100.00D;
    double value2 = 15.99D;
    double result = cc.Add(value1, value2);
    Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
    
    // Closing the client gracefully closes the connection and cleans up resources.
    cc.Close();
    
    Dim b As New WSHttpBinding(SecurityMode.Message)
    b.Security.Message.ClientCredentialType = MessageCredentialType.Windows
    
    Dim ea As New EndpointAddress("net.tcp://machinename:8036/endpoint")
    Dim cc As New CalculatorClient(b, ea)
    cc.Open()
    
    ' Alternatively, use a binding name from a configuration file generated by the
    ' SvcUtil.exe tool to create the client. Omit the binding and endpoint address 
    ' because that information is provided by the configuration file.
    ' CalculatorClass cc = new CalculatorClient("ICalculator_Binding")
    

Verwenden der KonfigurationsdateiUsing the Configuration File

Anstelle der Erstellung der Bindung mithilfe von prozeduralem Code können Sie auch den folgenden Code für den Bindungsabschnitt der Konfigurationsdatei verwenden.Instead of creating the binding with procedural code, you can use the following code shown for the bindings section of the configuration file.

Wenn Sie nicht bereits einen Dienst definiert haben, finden Sie unter entwerfen und Implementieren von Diensten, und Konfigurieren von Services.If you do not already have a service defined, see Designing and Implementing Services, and Configuring Services.

Hinweis dieser Konfigurationscode wird in sowohl im Dienst-als auch Konfigurationsdateien verwendet.Note This configuration code is used in both the service and client configuration files.

So aktivieren Sie mit der Konfiguration Übertragungssicherheit für einen Dienst in einer Windows-DomäneTo enable transfer security on a service in a Windows domain using configuration

  1. Hinzufügen einer <WsHttpBinding > Element an der <Bindungen > Elementabschnitt der Konfigurationsdatei.Add a <wsHttpBinding> element to the <bindings> element section of the configuration file.

  2. Fügen Sie dem <binding>-Element ein <WSHttpBinding>-Element hinzu, und legen Sie das configurationName-Attribut auf einen für Ihre Anwendung geeigneten Wert fest.Add a <binding> element to the <WSHttpBinding> element and set the configurationName attribute to a value appropriate to your application.

  3. Fügen Sie ein <security>-Element hinzu, und legen Sie das mode-Attribut auf "Message" fest.Add a <security> element and set the mode attribute to Message.

  4. Fügen Sie ein <message>-Element hinzu, und legen Sie das clientCredentialType-Attribut auf "Windows" fest.Add a <message> element and set the clientCredentialType attribute to Windows.

  5. Ersetzen Sie in der Konfigurationsdatei des Diensts den <bindings>-Abschnitt durch den folgenden Code.In the service's configuration file, replace the <bindings> section with the following code. Wenn Sie nicht bereits über eine Dienstkonfigurationsdatei verfügen, finden Sie unter Bindungen verwenden, und Konfigurieren von Diensten und Clients.If you do not already have a service configuration file, see Using Bindings to Configure Services and Clients.

    <bindings>  
      <wsHttpBinding>  
       <binding name = "wsHttpBinding_Calculator">  
         <security mode="Message">  
           <message clientCredentialType="Windows"/>  
         </security>  
        </binding>  
      </wsHttpBinding>  
    </bindings>  
    

Verwenden der Bindung in einem ClientUsing the Binding in a Client

In dieser Prozedur wird die Generierung zweier Dateien veranschaulicht: einem Proxy, der mit dem Dienst kommuniziert, und einer Konfigurationsdatei.This procedure shows how to generate two files: a proxy that communicates with the service and a configuration file. Darüber hinaus werden auch Änderungen am Clientprogramm beschrieben – der dritten Datei, die auf dem Client verwendet wird.It also describes changes to the client program, which is the third file used on the client.

So verwenden Sie eine Bindung für einen Client mit KonfigurationTo use a binding in a client with configuration
  1. Verwenden Sie das SvcUtil.exe-Tool, um den Proxycode und die Konfigurationsdatei aus den Metadaten des Diensts zu generieren.Use the SvcUtil.exe tool to generate the proxy code and configuration file from the service's metadata. Weitere Informationen finden Sie unter Vorgehensweise: Erstellen eines Clients.For more information, see How to: Create a Client.

  2. Ersetzen Sie die <Bindungen > Teil die generierte Konfigurationsdatei mit den Konfigurationscode aus dem vorherigen Abschnitt.Replace the <bindings> section of the generated configuration file with the configuration code from the preceding section.

  3. Prozeduraler Code wird am Anfang der Main-Methode des Clientprogramms eingefügt.Procedural code is inserted at the beginning of the Main method of the client program.

  4. Erstellen Sie eine Instanz der generierten Clientklasse, und geben Sie den Namen der Bindung in der Konfigurationsdatei als Eingabeparameter weiter.Create an instance of the generated client class passing the name of the binding in the configuration file as an input parameter.

  5. Rufen Sie die Open-Methode auf, wie im folgenden Code dargestellt:Call the Open method, as shown in the following code.

  6. Rufen Sie den Dienst auf, und zeigen Sie die Ergebnisse an.Call the service and display the results.

    // 4th Procedure:
    //  Using config instead of the binding-related code
    // In this case, use a binding name from a configuration file generated by the
    // SvcUtil.exe tool to create the client. Omit the binding and endpoint address 
    // because that information is provided by the configuration file.
    
    CalculatorClient cc = new CalculatorClient("ICalculator_Binding");
    cc.Open();
    
    // Now call the service and display the results
    // Call the Add service operation.
    double value1 = 100.00D;
    double value2 = 15.99D;
    double result = cc.Add(value1, value2);
    Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
    
    // Closing the client gracefully closes the connection and cleans up resources.
    cc.Close();
    

BeispielExample

using System;
using System.Collections;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Security.Permissions;

[assembly: SecurityPermission(SecurityAction.RequestMinimum, Execution = true)]
namespace Microsoft.Security.Samples
{
    public class Test
    {
        static void Main()
        {
            Test t = new Test();
            Console.WriteLine("Starting....");
            t.Run();

        }

        private void Run()
        {
            // First procedure:
            // create a WSHttpBinding that uses Windows credentials and message security
            WSHttpBinding myBinding = new WSHttpBinding();
            myBinding.Security.Mode = SecurityMode.Message;
            myBinding.Security.Message.ClientCredentialType =
                MessageCredentialType.Windows;

            // 2nd Procedure:
            // Use the binding in a service
            // Create the Type instances for later use and the URI for 
            // the base address.
            Type contractType = typeof(ICalculator);
            Type serviceType = typeof(Calculator);
            Uri baseAddress = new
                Uri("http://localhost:8036/SecuritySamples/");

            // Create the ServiceHost and add an endpoint, then start
            // the service.
            ServiceHost myServiceHost =
                new ServiceHost(serviceType, baseAddress);
            myServiceHost.AddServiceEndpoint
                (contractType, myBinding, "secureCalculator");

            //enable metadata
            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            myServiceHost.Description.Behaviors.Add(smb);

            myServiceHost.Open();
            Console.WriteLine("Listening");
            Console.WriteLine("Press Enter to close the service");
            Console.ReadLine();
            myServiceHost.Close();
        }
    }

    [ServiceContract]
    public interface ICalculator
    {
        [OperationContract]
        double Add(double a, double b);
    }

    public class Calculator : ICalculator
    {
        public double Add(double a, double b)
        {
            return a + b;
        }
    }
}
using System;
using System.Collections.Generic;
using System.ServiceModel;

namespace Client
{
    static class SecureClientCode
    {
        static void Main()
        {
            // 3rd Procedure:
            //  Creating a binding and using it in a service

            // To run using config, comment the following lines, and uncomment out the code
            // following this section
            WSHttpBinding b = new WSHttpBinding(SecurityMode.Message);
            b.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
            
            EndpointAddress ea = new EndpointAddress("Http://localhost:8036/SecuritySamples/secureCalculator");
            CalculatorClient cc = new CalculatorClient(b, ea);
            cc.Open();

            // Now call the service and display the results
            // Call the Add service operation.
            double value1 = 100.00D;
            double value2 = 15.99D;
            double result = cc.Add(value1, value2);
            Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

            // Closing the client gracefully closes the connection and cleans up resources.
            cc.Close();
        }

        static void Main2()
        {
            // 4th Procedure:
            //  Using config instead of the binding-related code
            // In this case, use a binding name from a configuration file generated by the
            // SvcUtil.exe tool to create the client. Omit the binding and endpoint address 
            // because that information is provided by the configuration file.

            CalculatorClient cc = new CalculatorClient("ICalculator_Binding");
            cc.Open();

            // Now call the service and display the results
            // Call the Add service operation.
            double value1 = 100.00D;
            double value2 = 15.99D;
            double result = cc.Add(value1, value2);
            Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

            // Closing the client gracefully closes the connection and cleans up resources.
            cc.Close();
        }
    }


    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(Namespace = "http://Microsoft.ServiceModel.Samples", ConfigurationName = "ICalculator")]
    public interface ICalculator
    {

        [System.ServiceModel.OperationContractAttribute(Action = "http://Microsoft.ServiceModel.Samples/ICalculator/Add", ReplyAction = "http://Microsoft.ServiceModel.Samples/ICalculator/AddResponse")]
        double Add(double n1, double n2);

        [System.ServiceModel.OperationContractAttribute(Action = "http://Microsoft.ServiceModel.Samples/ICalculator/Subtract", ReplyAction = "http://Microsoft.ServiceModel.Samples/ICalculator/SubtractResponse")]
        double Subtract(double n1, double n2);

        [System.ServiceModel.OperationContractAttribute(Action = "http://Microsoft.ServiceModel.Samples/ICalculator/Multiply", ReplyAction = "http://Microsoft.ServiceModel.Samples/ICalculator/MultiplyResponse")]
        double Multiply(double n1, double n2);

        [System.ServiceModel.OperationContractAttribute(Action = "http://Microsoft.ServiceModel.Samples/ICalculator/Divide", ReplyAction = "http://Microsoft.ServiceModel.Samples/ICalculator/DivideResponse")]
        double Divide(double n1, double n2);
    }

    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
    public interface ICalculatorChannel : ICalculator, System.ServiceModel.IClientChannel
    {
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
    public class CalculatorClient : System.ServiceModel.ClientBase<ICalculator>, ICalculator
    {

        public CalculatorClient()
        {
        }

        public CalculatorClient(string endpointConfigurationName)
            :
                base(endpointConfigurationName)
        {
        }

        public CalculatorClient(string endpointConfigurationName, string remoteAddress)
            :
                base(endpointConfigurationName, remoteAddress)
        {
        }

        public CalculatorClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress)
            :
                base(endpointConfigurationName, remoteAddress)
        {
        }

        public CalculatorClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress)
            :
                base(binding, remoteAddress)
        {
        }

        public double Add(double n1, double n2)
        {
            return base.Channel.Add(n1, n2);
        }

        public double Subtract(double n1, double n2)
        {
            return base.Channel.Subtract(n1, n2);
        }

        public double Multiply(double n1, double n2)
        {
            return base.Channel.Multiply(n1, n2);
        }

        public double Divide(double n1, double n2)
        {
            return base.Channel.Divide(n1, n2);
        }
    }

}
Imports System
Imports System.Collections.Generic
Imports System.ServiceModel



Public Class Program
    
    Shared Sub Main() 
        Dim b As New WSHttpBinding(SecurityMode.Message)
        b.Security.Message.ClientCredentialType = MessageCredentialType.Windows
        
        Dim ea As New EndpointAddress("net.tcp://machinename:8036/endpoint")
        Dim cc As New CalculatorClient(b, ea)
        cc.Open()
 
        ' Alternatively, use a binding name from a configuration file generated by the
        ' SvcUtil.exe tool to create the client. Omit the binding and endpoint address 
        ' because that information is provided by the configuration file.
        ' CalculatorClass cc = new CalculatorClient("ICalculator_Binding")
    End Sub 
End Class 'Program


<System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0"), System.ServiceModel.ServiceContractAttribute([Namespace] := "http://Microsoft.ServiceModel.Samples", ConfigurationName := "ICalculator")>  _
Public Interface ICalculator
    
    <System.ServiceModel.OperationContractAttribute(Action := "http://Microsoft.ServiceModel.Samples/ICalculator/Add", ReplyAction := "http://Microsoft.ServiceModel.Samples/ICalculator/AddResponse")>  _
    Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double 
    
    <System.ServiceModel.OperationContractAttribute(Action := "http://Microsoft.ServiceModel.Samples/ICalculator/Subtract", ReplyAction := "http://Microsoft.ServiceModel.Samples/ICalculator/SubtractResponse")>  _
    Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double 
    
    <System.ServiceModel.OperationContractAttribute(Action := "http://Microsoft.ServiceModel.Samples/ICalculator/Multiply", ReplyAction := "http://Microsoft.ServiceModel.Samples/ICalculator/MultiplyResponse")>  _
    Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double 
    
    <System.ServiceModel.OperationContractAttribute(Action := "http://Microsoft.ServiceModel.Samples/ICalculator/Divide", ReplyAction := "http://Microsoft.ServiceModel.Samples/ICalculator/DivideResponse")>  _
    Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double 
End Interface 'ICalculator

<System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")>  _
Public Interface ICalculatorChannel
    : Inherits ICalculator, System.ServiceModel.IClientChannel
End Interface 'ICalculatorChannel

<System.Diagnostics.DebuggerStepThroughAttribute(), System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")>  _
Public Class CalculatorClient
    Inherits System.ServiceModel.ClientBase(Of ICalculator)
    Implements ICalculator
     
    Public Sub New() 
     '
    End Sub 'New
    
    
    Public Sub New(ByVal endpointConfigurationName As String) 
        MyBase.New(endpointConfigurationName)
    
    End Sub 'New
    
    
    Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As String) 
        MyBase.New(endpointConfigurationName, remoteAddress)
    
    End Sub 'New
    
    
    Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As System.ServiceModel.EndpointAddress) 
        MyBase.New(endpointConfigurationName, remoteAddress)
    
    End Sub 'New
    
    
    Public Sub New(ByVal binding As System.ServiceModel.Channels.Binding, ByVal remoteAddress As System.ServiceModel.EndpointAddress) 
        MyBase.New(binding, remoteAddress)
    
    End Sub 'New
    
    
    Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Add
        Return MyBase.Channel.Add(n1, n2)
    
    End Function 'Add
    
    
    Public Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Subtract
        Return MyBase.Channel.Subtract(n1, n2)
    
    End Function 'Subtract
    
    
    Public Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Multiply
        Return MyBase.Channel.Multiply(n1, n2)
    
    End Function 'Multiply
    
    
    Public Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Divide
        Return MyBase.Channel.Divide(n1, n2)
    
    End Function 'Divide
End Class 'CalculatorClient

Siehe auchSee Also

WSHttpBinding
ServiceModel Metadata Utility-Tool (Svcutil.exe)ServiceModel Metadata Utility Tool (Svcutil.exe)
Vorgehensweise: Erstellen eines ClientsHow to: Create a Client
Sichern von DienstenSecuring Services
Übersicht über die SicherheitSecurity Overview