Gewusst wie: Verfügbarmachen eines Vertrags für SOAP- und WebclientsHow to: Expose a Contract to SOAP and Web Clients

Standardmäßig stellt Windows Communication Foundation (WCF) Endpunkte nur für die SOAP-Clients zur Verfügung.By default, Windows Communication Foundation (WCF) makes endpoints available only to SOAP clients. In Vorgehensweise: Erstellen einer grundlegenden WCF-Web-HTTP-Diensts, ein Endpunkt für nicht-SOAP-Clients verfügbar gemacht wird.In How to: Create a Basic WCF Web HTTP Service, an endpoint is made available to non-SOAP clients. Manchmal möchten Sie jedoch einen Vertrag für beide Wege verfügbar machen, als Webendpunkt und als SOAP-Endpunkt.There may be times when you want to make the same contract available both ways, as a Web endpoint and as a SOAP endpoint. In diesem Thema wird ein Beispiel für diesen Vorgang gezeigt.This topic shows an example of how to do this.

So definieren Sie den DienstvertragTo define the service contract

  1. Definieren Sie einen Dienstvertrag mit einer Schnittstelle, die mit den Attributen ServiceContractAttribute, WebInvokeAttribute und WebGetAttribute gekennzeichnet ist, wie im folgenden Code gezeigt.Define a service contract using an interface marked with the ServiceContractAttribute, WebInvokeAttribute and the WebGetAttribute attributes, as shown in the following code.

    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        [WebGet]
        string EchoWithGet(string s);
    
        [OperationContract]
        [WebInvoke]
        string EchoWithPost(string s);
    }
    
    <ServiceContract()> _
    Public Interface IService
    
        <OperationContract()> _
        <WebGet()> _
        Function EchoWithGet(ByVal s As String) As String
    
        <OperationContract()> _
        <WebInvoke()> _
        Function EchoWithPost(ByVal s As String) As String
    End Interface
    

    Hinweis

    Standardmäßig ordnet WebInvokeAttribute dem Vorgang POST-Aufrufe zu.By default WebInvokeAttribute maps POST calls to the operation. Sie können jedoch die Methode, die dem Vorgang zugeordnet werden soll, mit einem "method="-Parameter angeben.You can, however, specify the method to map to the operation by specifying a "method=" parameter. WebGetAttribute besitzt keinen "method="-Parameter und ordnet dem Dienstvorgang nur GET-Aufrufe zu.WebGetAttribute does not have a "method=" parameter and only maps GET calls to the service operation.

  2. Implementieren Sie den Dienstvertrag, wie im folgenden Code gezeigt.Implement the service contract, as shown in the following code.

    public class Service : IService
    {
        public string EchoWithGet(string s)
        {
            return "You said " + s;
        }
    
        public string EchoWithPost(string s)
        {
            return "You said " + s;
        }
    }
    
    Public Class Service
        Implements IService
        Public Function EchoWithGet(ByVal s As String) As String Implements IService.EchoWithGet
            Return "You said " + s
        End Function
    
        Public Function EchoWithPost(ByVal s As String) As String Implements IService.EchoWithPost
            Return "You said " + s
        End Function
    End Class
    

So hosten Sie den DienstTo host the service

  1. Erstellen Sie ein ServiceHost-Element, wie im folgenden Code gezeigt.Create a ServiceHost object, as shown in the following code.

    ServiceHost host = new ServiceHost(typeof(Service), new Uri("http://localhost:8000"));
    
    Dim host As New ServiceHost(GetType(Service), New Uri("http://localhost:8000"))
    
  2. Fügen Sie einen ServiceEndpoint mit BasicHttpBinding für den SOAP-Endpunkt hinzu, wie im folgenden Code gezeigt.Add a ServiceEndpoint with BasicHttpBinding for the SOAP endpoint, as shown in the following code.

    host.AddServiceEndpoint(typeof(IService), new BasicHttpBinding(), "Soap");
    
    host.AddServiceEndpoint(GetType(IService), New BasicHttpBinding(), "Soap")
    
  3. Fügen Sie einen ServiceEndpoint mit WebHttpBinding für einen Nicht-SOAP-Endpunkt hinzu und fügen Sie das WebHttpBehavior dem Endpunkt hinzu, wie im folgenden Code gezeigt.Add a ServiceEndpoint with WebHttpBinding for the non-SOAP endpoint and add the WebHttpBehavior to the endpoint, as shown in the following code.

    ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(IService), new WebHttpBinding(), "Web");
    endpoint.Behaviors.Add(new WebHttpBehavior());
    
    Dim endpoint As ServiceEndpoint
    endpoint = host.AddServiceEndpoint(GetType(IService), New WebHttpBinding(), "Web")
    endpoint.Behaviors.Add(New WebHttpBehavior())
    
  4. Rufen Sie Open() für eine ServiceHost-Instanz hinzu, um den Diensthost zu öffnen, wie im folgenden Code gezeigt.Call Open() on a ServiceHost instance to open the service host, as shown in the following code.

    host.Open();
    
    host.Open()
    

So rufen Sie Dienstvorgänge auf, die GET in Internet Explorer zugeordnet werdenTo call service operations mapped to GET in Internet Explorer

  1. Öffnen Sie Internet Explorer, und geben "http://localhost:8000/Web/EchoWithGet?s=Hello, world!", und drücken Sie die EINGABETASTE.Open Internet Explorer and type "http://localhost:8000/Web/EchoWithGet?s=Hello, world!" and press ENTER. Die URL enthält die Basisadresse des Diensts ("http://localhost:8000/"), die relative Adresse des Endpunkts (""), der Dienstvorgang aufrufen ("EchoWithGet") und ein Fragezeichen gefolgt von einer Liste benannter Parameter getrennt durch ein kaufmännisches und-Zeichen (&).The URL contains the base address of the service ("http://localhost:8000/"), the relative address of the endpoint (""), the service operation to call ("EchoWithGet"), and a question mark followed by a list of named parameters separated by an ampersand (&).

So rufen Sie Dienstvorgänge auf dem Webendpunkt im Code aufTo call service operations on the Web endpoint in code

  1. Erstellen Sie eine Instanz von WebChannelFactory<TChannel> in einem using-Block, wie im folgenden Code veranschaulicht.Create an instance of WebChannelFactory<TChannel> within a using block, as shown in the following code.

    using (WebChannelFactory<IService> wcf = new WebChannelFactory<IService>(new Uri("http://localhost:8000/Web")))
    
    Using wcf As New WebChannelFactory(Of IService)(New Uri("http://localhost:8000/Web"))
    

Hinweis

Close() wird am Ende des using-Blocks automatisch für den Kanal aufgerufen.Close() is automatically called on the channel at the end of the using block.

  1. Erstellen Sie den Kanal, und rufen Sie den Dienst auf, wie im folgenden Code gezeigt.Create the channel and call the service, as shown in the following code.

    IService channel = wcf.CreateChannel();
    
    string s;
    
    Console.WriteLine("Calling EchoWithGet by HTTP GET: ");
    s = channel.EchoWithGet("Hello, world");
    Console.WriteLine("   Output: {0}", s);
    
    Console.WriteLine("");
    Console.WriteLine("This can also be accomplished by navigating to");
    Console.WriteLine("http://localhost:8000/Web/EchoWithGet?s=Hello, world!");
    Console.WriteLine("in a web browser while this sample is running.");
    
    Console.WriteLine("");
    
    Console.WriteLine("Calling EchoWithPost by HTTP POST: ");
    s = channel.EchoWithPost("Hello, world");
    Console.WriteLine("   Output: {0}", s);
    
    Dim channel As IService = wcf.CreateChannel()
    
    Dim s As String
    
    Console.WriteLine("Calling EchoWithGet by HTTP GET: ")
    s = channel.EchoWithGet("Hello, world")
    Console.WriteLine("   Output:  {0}", s)
    
    Console.WriteLine("")
    Console.WriteLine("This can also be accomplished by navigating to")
    Console.WriteLine("http://localhost:8000/Web/EchoWithGet?s=Hello, world!")
    Console.WriteLine("in a web browser while this sample is running.")
    
    Console.WriteLine("")
    
    Console.WriteLine("Calling EchoWithPost by HTTP POST: ")
    s = channel.EchoWithPost("Hello, world")
    Console.WriteLine("   Output:  {0}", s)
    

So rufen Sie Dienstvorgänge an dem SOAP-Endpunkt aufTo call service operations on the SOAP endpoint

  1. Erstellen Sie eine Instanz von ChannelFactory in einem using-Block, wie im folgenden Code veranschaulicht.Create an instance of ChannelFactory within a using block, as shown in the following code.

    using (ChannelFactory<IService> scf = new ChannelFactory<IService>(new BasicHttpBinding(), "http://localhost:8000/Soap"))
    
    Using scf As New ChannelFactory(Of IService)(New BasicHttpBinding(), "http://localhost:8000/Soap")
    
  2. Erstellen Sie den Kanal, und rufen Sie den Dienst auf, wie im folgenden Code gezeigt.Create the channel and call the service, as shown in the following code.

    IService channel = scf.CreateChannel();
    
    string s;
    
    Console.WriteLine("Calling EchoWithGet on SOAP endpoint: ");
    s = channel.EchoWithGet("Hello, world");
    Console.WriteLine("   Output: {0}", s);
    
    Console.WriteLine("");
    
    Console.WriteLine("Calling EchoWithPost on SOAP endpoint: ");
    s = channel.EchoWithPost("Hello, world");
    Console.WriteLine("   Output: {0}", s);
    
    Dim channel As IService = scf.CreateChannel()
    
    Dim s As String
    
    Console.WriteLine("Calling EchoWithGet on SOAP endpoint: ")
    s = channel.EchoWithGet("Hello, world")
    Console.WriteLine("   Output:  {0}", s)
    
    Console.WriteLine("")
    
    Console.WriteLine("Calling EchoWithPost on SOAP endpoint: ")
    s = channel.EchoWithPost("Hello, world")
    Console.WriteLine("   Output:  {0}", s)
    

So schließen Sie den DiensthostTo close the service host

  1. Schließen Sie den Diensthost, wie im folgenden Code gezeigt.Close the service host, as shown in the following code.

    host.Close();
    
    host.Close()
    

BeispielExample

Unten folgt die vollständige Codeauflistung für dieses Thema.The following is the full code listing for this topic.

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Web;
using System.Text;

namespace Microsoft.ServiceModel.Samples.BasicWebProgramming
{
    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        [WebGet]
        string EchoWithGet(string s);

        [OperationContract]
        [WebInvoke]
        string EchoWithPost(string s);
    }

    public class Service : IService
    {
        public string EchoWithGet(string s)
        {
            return "You said " + s;
        }

        public string EchoWithPost(string s)
        {
            return "You said " + s;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(Service), new Uri("http://localhost:8000"));
            host.AddServiceEndpoint(typeof(IService), new BasicHttpBinding(), "Soap");
            ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(IService), new WebHttpBinding(), "Web");
            endpoint.Behaviors.Add(new WebHttpBehavior());
            
            try
            {
                host.Open();

                using (WebChannelFactory<IService> wcf = new WebChannelFactory<IService>(new Uri("http://localhost:8000/Web")))
                {
                    IService channel = wcf.CreateChannel();

                    string s;

                    Console.WriteLine("Calling EchoWithGet by HTTP GET: ");
                    s = channel.EchoWithGet("Hello, world");
                    Console.WriteLine("   Output: {0}", s);

                    Console.WriteLine("");
                    Console.WriteLine("This can also be accomplished by navigating to");
                    Console.WriteLine("http://localhost:8000/Web/EchoWithGet?s=Hello, world!");
                    Console.WriteLine("in a web browser while this sample is running.");

                    Console.WriteLine("");

                    Console.WriteLine("Calling EchoWithPost by HTTP POST: ");
                    s = channel.EchoWithPost("Hello, world");
                    Console.WriteLine("   Output: {0}", s);
                    Console.WriteLine("");
                }
                using (ChannelFactory<IService> scf = new ChannelFactory<IService>(new BasicHttpBinding(), "http://localhost:8000/Soap"))
                {
                    IService channel = scf.CreateChannel();

                    string s;

                    Console.WriteLine("Calling EchoWithGet on SOAP endpoint: ");
                    s = channel.EchoWithGet("Hello, world");
                    Console.WriteLine("   Output: {0}", s);

                    Console.WriteLine("");

                    Console.WriteLine("Calling EchoWithPost on SOAP endpoint: ");
                    s = channel.EchoWithPost("Hello, world");
                    Console.WriteLine("   Output: {0}", s);
                    Console.WriteLine("");
                }


                Console.WriteLine("Press [Enter] to terminate");
                Console.ReadLine();
                host.Close();
            }
            catch (CommunicationException cex)
            {
                Console.WriteLine("An exception occurred: {0}", cex.Message);
                host.Abort();
            }
        }
    }
}
Imports System
Imports System.Collections.Generic
Imports System.ServiceModel
Imports System.ServiceModel.Description
Imports System.ServiceModel.Web
Imports System.Text

<ServiceContract()> _
Public Interface IService

    <OperationContract()> _
    <WebGet()> _
    Function EchoWithGet(ByVal s As String) As String

    <OperationContract()> _
    <WebInvoke()> _
    Function EchoWithPost(ByVal s As String) As String
End Interface

Public Class Service
    Implements IService
    Public Function EchoWithGet(ByVal s As String) As String Implements IService.EchoWithGet
        Return "You said " + s
    End Function

    Public Function EchoWithPost(ByVal s As String) As String Implements IService.EchoWithPost
        Return "You said " + s
    End Function
End Class
Module Program

    Sub Main()
        Dim host As New ServiceHost(GetType(Service), New Uri("http://localhost:8000"))
        host.AddServiceEndpoint(GetType(IService), New BasicHttpBinding(), "Soap")
        Dim endpoint As ServiceEndpoint
        endpoint = host.AddServiceEndpoint(GetType(IService), New WebHttpBinding(), "Web")
        endpoint.Behaviors.Add(New WebHttpBehavior())

        Try
            host.Open()

            Using wcf As New WebChannelFactory(Of IService)(New Uri("http://localhost:8000/Web"))

                Dim channel As IService = wcf.CreateChannel()

                Dim s As String

                Console.WriteLine("Calling EchoWithGet by HTTP GET: ")
                s = channel.EchoWithGet("Hello, world")
                Console.WriteLine("   Output:  {0}", s)

                Console.WriteLine("")
                Console.WriteLine("This can also be accomplished by navigating to")
                Console.WriteLine("http://localhost:8000/Web/EchoWithGet?s=Hello, world!")
                Console.WriteLine("in a web browser while this sample is running.")

                Console.WriteLine("")

                Console.WriteLine("Calling EchoWithPost by HTTP POST: ")
                s = channel.EchoWithPost("Hello, world")
                Console.WriteLine("   Output:  {0}", s)
                Console.WriteLine("")
            End Using
            Using scf As New ChannelFactory(Of IService)(New BasicHttpBinding(), "http://localhost:8000/Soap")

                Dim channel As IService = scf.CreateChannel()

                Dim s As String

                Console.WriteLine("Calling EchoWithGet on SOAP endpoint: ")
                s = channel.EchoWithGet("Hello, world")
                Console.WriteLine("   Output:  {0}", s)

                Console.WriteLine("")

                Console.WriteLine("Calling EchoWithPost on SOAP endpoint: ")
                s = channel.EchoWithPost("Hello, world")
                Console.WriteLine("   Output:  {0}", s)
                Console.WriteLine("")
            End Using


            Console.WriteLine("Press <Enter> to terminate")
            Console.ReadLine()
            host.Close()
        Catch cex As CommunicationException
            Console.WriteLine("An exception occurred:  {0}", cex.Message)
            host.Abort()
        End Try

    End Sub
End Module

Kompilieren des CodesCompiling the Code

Verweisen Sie beim Kompilieren der Datei Service.cs auf System.ServiceModel.dll und System.ServiceModel.Web.dll.When compiling Service.cs, reference System.ServiceModel.dll and System.ServiceModel.Web.dll.

Siehe auchSee Also

WebHttpBinding
WebGetAttribute
WebInvokeAttribute
WebServiceHost
ChannelFactory
WebHttpBehavior
WCF-Web-HTTP-ProgrammiermodellWCF Web HTTP Programming Model