Vergleichen von ASP.NET-Webdiensten mit WCF auf Grundlage der EntwicklungComparing ASP.NET Web Services to WCF Based on Development

Windows Communication Foundation (WCF) verfügt über eine-ASP.NET-kompatibilitätsmodusoption zum Aktivieren der WCF-Clientanwendungen programmiert werden, und wie ASP.NET-Webdienste konfiguriert und imitieren des Verhaltens.Windows Communication Foundation (WCF) has an ASP.NET compatibility mode option to enable WCF applications to be programmed and configured like ASP.NET Web services, and mimic their behavior. In den folgenden Abschnitten Vergleichen von ASP.NET-Webdiensten und WCF je nachdem welche Anwendungsentwicklung mithilfe beider Technologien erforderlich ist.The following sections compare ASP.NET Web services and WCF based on what is required to develop applications using both technologies.

DatendarstellungData Representation

Die Entwicklung eines Webdiensts mit ASP.NET beginnt normalerweise mit der Definition aller komplexen Datentypen, die vom Dienst verwendet werden sollen.The development of a Web service with ASP.NET typically begins with defining any complex data types the service is to use. ASP.NET verwendet XmlSerializer, um Daten, die von .NET Framework-Typen dargestellt werden, zur Übertragung an oder von einem Dienst in XML zu übersetzen und als XML empfangene Daten in .NET Framework-Objekte zu übersetzen.ASP.NET relies on the XmlSerializer to translate data represented by .NET Framework types to XML for transmission to or from a service and to translate data received as XML into .NET Framework objects. Die Definition der komplexen Datentypen, die ein ASP.NET-Dienst verwenden soll, erfordert die Definition von .NET Framework-Klassen, die XmlSerializer in und aus XML serialisieren kann.Defining the complex data types that an ASP.NET service is to use requires the definition of .NET Framework classes that the XmlSerializer can serialize to and from XML. Derartige Klassen können manuell geschrieben oder aus Definitionen der Typen in XML-Schema generiert werden. Dies geschieht mithilfe von xsd.exe, dem Befehlszeilen-Unterstützungsprogramm für XML-Schemas/-Datentypen.Such classes can be written manually, or generated from definitions of the types in XML Schema using the command-line XML Schemas/Data Types Support Utility, xsd.exe.

Nachfolgend finden Sie eine Auflistung wesentlicher Probleme, die beim Definieren von .NET Framework-Klassen auftreten können, die XmlSerializer in und aus XML serialisieren kann:The following is a list of key issues to know when defining .NET Framework classes that the XmlSerializer can serialize to and from XML:

  • Nur die öffentlichen Felder und Eigenschaften von .NET Framework-Objekten werden in XML übersetzt.Only the public fields and properties of .NET Framework objects are translated into XML.

  • Instanzen der Auflistungsklassen können nur in XML serialisiert werden, wenn die Klassen entweder die IEnumerable-Schnittstelle oder die ICollection-Schnittstelle implementieren.Instances of collection classes can be serialized into XML only if the classes implement either the IEnumerable or ICollection interface.

  • Klassen, die die IDictionary-Schnittstelle, zum Beispiel Hashtable, implementieren, können nicht in XML serialisiert werden.Classes that implement the IDictionary interface, such as Hashtable, cannot be serialized into XML.

  • Die zahlreichen Attributtypen im System.Xml.Serialization-Namespace können einer .NET Framework-Klasse und deren Membern hinzugefügt werden, um die Darstellung der Klasseninstanzen in XML zu steuern.The great many attribute types in the System.Xml.Serialization namespace can be added to a .NET Framework class and its members to control how instances of the class are represented in XML.

WCF--Anwendungsentwicklung beginnt normalerweise ebenfalls mit der Definition von komplexen Typen.WCF application development usually also begins with the definition of complex types. WCF kann vorgenommen werden, dieselben .NET Framework-Typen wie ASP.NET-Webdienste zu verwenden.WCF can be made to use the same .NET Framework types as ASP.NET Web services.

Die WCFDataContractAttribute und DataMemberAttribute .NET Framework-Typen, um anzugeben, dass Instanzen des Typs werden serialisiert werden soll, in XML und welche bestimmten Felder oder Eigenschaften des Typs werden serialisiert werden soll, wie im folgenden Beispielcode gezeigt hinzugefügt werden können.The WCFDataContractAttribute and DataMemberAttribute can be added to .NET Framework types to indicate that instances of the type are to be serialized into XML, and which particular fields or properties of the type are to be serialized, as shown in the following sample code.

//Example One:   
[DataContract]  
public class LineItem  
{  
    [DataMember]  
    public string ItemNumber;  
    [DataMember]  
    public decimal Quantity;  
    [DataMember]  
    public decimal UnitPrice;  
}  

//Example Two:   
public class LineItem  
{  
    [DataMember]  
    private string itemNumber;  
    [DataMember]  
    private decimal quantity;  
    [DataMember]  
    private decimal unitPrice;  

    public string ItemNumber  
    {  
      get  
      {  
          return this.itemNumber;  
      }  

      set  
      {  
          this.itemNumber = value;  
      }  
    }  

    public decimal Quantity  
    {  
        get  
        {  
            return this.quantity;  
        }  

        set  
        {  
            this.quantity = value;  
        }  
    }  

    public decimal UnitPrice  
    {  
      get  
      {  
          return this.unitPrice;  
      }  

      set  
      {  
          this.unitPrice = value;  
      }  
    }  
}  

//Example Three:   
public class LineItem  
{  
     private string itemNumber;  
     private decimal quantity;  
     private decimal unitPrice;  

     [DataMember]  
     public string ItemNumber  
     {  
       get  
       {  
          return this.itemNumber;  
       }  

       set  
       {  
           this.itemNumber = value;  
       }  
     }  

     [DataMember]  
     public decimal Quantity  
     {  
          get  
          {  
              return this.quantity;  
          }  

          set  
          {  
             this.quantity = value;  
          }  
     }  

     [DataMember]  
     public decimal UnitPrice  
     {  
          get  
          {  
              return this.unitPrice;  
          }  

          set  
          {  
              this.unitPrice = value;  
          }  
     }  
}  

DataContractAttribute gibt an, dass null oder mehr Felder oder Eigenschaften eines Typs serialisiert werden sollen. DataMemberAttribute gibt dagegen an, dass ein bestimmtes Feld oder eine Eigenschaft serialisiert werden soll.The DataContractAttribute signifies that zero or more of a type’s fields or properties are to be serialized, while the DataMemberAttribute indicates that a particular field or property is to be serialized. DataContractAttribute kann für eine Klasse oder Struktur übernommen werden.The DataContractAttribute can be applied to a class or structure. DataMemberAttribute kann auf ein Feld oder eine Eigenschaft angewendet werden, und die Felder und Eigenschaften, für die das Attribut übernommen wird, können entweder öffentlich oder privat sein.The DataMemberAttribute can be applied to a field or a property, and the fields and properties to which the attribute is applied can be either public or private. Instanzen von Typen, die DataContractAttribute angewendet, um diese bezeichnet als Datenverträge in WCF.Instances of types that have the DataContractAttribute applied to them are referred to as data contracts in WCF. Sie werden mit DataContractSerializer in XML serialisiert.They are serialized into XML using DataContractSerializer.

Nachfolgend finden Sie eine Liste der wichtigen Unterschiede zwischen der Verwendung von DataContractSerializer und der Verwendung von XmlSerializer sowie der verschiedenen Attribute des System.Xml.Serialization-Namespace.The following is a list of the important differences between using the DataContractSerializer and using the XmlSerializer and the various attributes of the System.Xml.Serialization namespace.

  • XmlSerializer und die Attribute des System.Xml.Serialization-Namespace ermöglichen das Zuordnen von .NET Framework-Typen zu jedem gültigen Typ, der in XML-Schema definiert ist. Dadurch ermöglichen sie eine außerordentlich genaue Steuerung der Darstellung eines Typs in XML.The XmlSerializer and the attributes of the System.Xml.Serialization namespace are designed to allow you to map .NET Framework types to any valid type defined in XML Schema, and so they provide for very precise control over how a type is represented in XML. DataContractSerializer, DataContractAttribute und DataMemberAttribute bieten nur sehr wenige Möglichkeiten zur Steuerung der Darstellung eines Typs in XML.The DataContractSerializer, DataContractAttribute and DataMemberAttribute provide very little control over how a type is represented in XML. Angegeben werden können nur die Namespaces und Namen, die zum Darstellen des Typs und der Felder oder Eigenschaften in XML verwendet werden, sowie die Reihenfolge, in der die Felder und Eigenschaften in XML angezeigt werden:You can only specify the namespaces and names used to represent the type and its fields or properties in the XML, and the sequence in which the fields and properties appear in the XML:

    [DataContract(  
    Namespace="urn:Contoso:2006:January:29",  
    Name="LineItem")]  
    public class LineItem  
    {  
         [DataMember(Name="ItemNumber",IsRequired=true,Order=0)]  
         public string itemNumber;  
         [DataMember(Name="Quantity",IsRequired=false,Order = 1)]  
         public decimal quantity;  
         [DataMember(Name="Price",IsRequired=false,Order = 2)]  
         public decimal unitPrice;  
    }  
    

    Alle anderen Aspekte der Struktur von XML, mit der der .NET-Typ dargestellt wird, werden von DataContractSerializer bestimmt.Everything else about the structure of the XML used to represent the .NET type is determined by the DataContractSerializer.

  • Dadurch, dass keine umfassenden Möglichkeiten zur Steuerung der Darstellung eines Typs in XML gewährt werden, wird der Serialisierungsprozess für DataContractSerializer leicht vorhersehbar und die Optimierung dadurch vereinfacht.By not permitting much control over how a type is to be represented in XML, the serialization process becomes highly predictable for the DataContractSerializer, and, thereby, easier to optimize. Ein praktischer Vorteil des Entwurfs von DataContractSerializer ist eine um etwa zehn Prozent höhere Leistung.A practical benefit of the design of the DataContractSerializer is better performance, approximately ten percent better performance.

  • Die Attribute für die Verwendung mit XmlSerializer geben nicht an, welche Felder oder Eigenschaften des Typs in XML serialisiert werden, wohingegen DataMemberAttribute für die Verwendung mit DataContractSerializer explizit die zu serialisierenden Felder oder Eigenschaften anzeigt.The attributes for use with the XmlSerializer do not indicate which fields or properties of the type are serialized into XML, whereas the DataMemberAttribute for use with the DataContractSerializer shows explicitly which fields or properties are serialized. Daher handelt es sich bei den Datenverträgen um explizite Verträge über die Struktur der Daten, die von einer Anwendung gesendet und empfangen werden.Therefore, data contracts are explicit contracts about the structure of the data that an application is to send and receive.

  • XmlSerializer kann nur die öffentlichen Member eines .NET-Objekts in XML übersetzen, und DataContractSerializer kann die Member eines Objekts unabhängig von den Zugriffsmodifizierern dieser Member in XML übersetzen.The XmlSerializer can only translate the public members of a .NET object into XML, the DataContractSerializer can translate the members of objects into XML regardless of the access modifiers of those members.

  • Da die nicht öffentlichen Member der Typen in XML serialisiert werden können, gelten für DataContractSerializer weniger Einschränkungen bezüglich der Vielfalt der .NET-Typen, die in XML serialisiert werden können.As a consequence of being able to serialize the non-public members of types into XML, the DataContractSerializer has fewer restrictions on the variety of .NET types that it can serialize into XML. Insbesondere ist eine Übersetzung in XML-Typen wie Hashtable möglich, mit denen die IDictionary-Schnittstelle implementiert wird.In particular, it can translate into XML types like Hashtable that implement the IDictionary interface. DataContractSerializer ist mit einer weitaus höheren Wahrscheinlichkeit in der Lage, die Instanzen eines beliebigen zuvor vorhandenen .NET-Typs in XML zu serialisieren, ohne entweder die Definition des Typs ändern oder einen Wrapper dafür entwickeln zu müssen.The DataContractSerializer is much more likely to be able to serialize the instances of any pre-existing .NET type into XML without having to either modify the definition of the type or develop a wrapper for it.

  • Da DataContractSerializer auf die nicht öffentlichen Member eines Typs zugreifen kann, ist im Gegensatz zu XmlSerializer zudem volle Vertrauenswürdigkeit erforderlich.Another consequence of the DataContractSerializer being able to access the non-public members of a type is that it requires full trust, whereas the XmlSerializer does not. Codezugriffsberechtigung volle Vertrauenswürdigkeit ermöglicht vollständigen Zugriff auf alle Ressourcen auf einem Computer, der mit den Anmeldeinformationen, unter denen der Code ausgeführt wird, zugegriffen werden kann.The Full Trust code access permission gives complete access to all resources on a machine that can be accessed using the credentials under which the code is executing. Diese Option sollte mit Vorsicht verwendet werden, wie voll vertrauenswürdiger Code auf alle Ressourcen auf dem Computer zugreift.This option should be used with care as fully trusted code accesses all resources on your machine.

  • DataContractSerializer bietet einige Unterstützung für Versionsverwaltung:The DataContractSerializer incorporates some support for versioning:

    • DataMemberAttribute verfügt über eine IsRequired-Eigenschaft, der der Wert false für Member zugewiesen werden kann, die neuen Versionen eines Datenvertrags hinzugefügt werden, die in früheren Versionen noch nicht vorhanden waren. Dadurch wird Anwendungen mit der neueren Version des Vertrags das Verarbeiten früherer Versionen ermöglicht.The DataMemberAttribute has an IsRequired property that can be assigned a value of false for members that are added to new versions of a data contract that were not present in earlier versions, thereby allowing applications with the newer version of the contract to be able to process earlier versions.

    • Wenn mit einem Datenvertrag die IExtensibleDataObject-Schnittstelle implementiert wird, kann DataContractSerializer das Übergeben von Membern gestattet werden, die in neueren Versionen eines Datenvertrags durch Anwendungen mit älteren Versionen des Vertrags definiert sind.By having a data contract implement the IExtensibleDataObject interface, one can allow the DataContractSerializer to pass members defined in newer versions of a data contract through applications with earlier versions of the contract.

Ungeachtet aller Unterschiede ist das XML, in das XmlSerializer standardmäßig einen Typ serialisiert, semantisch identisch mit dem XML, in das DataContractSerializer einen Typ serialisiert, vorausgesetzt, dass der Namespace für das XML explizit definiert ist.Despite all of the differences, the XML into which the XmlSerializer serializes a type by default is semantically identical to the XML into which the DataContractSerializer serializes a type, provided the namespace for the XML is explicitly defined. Die folgende Klasse, die Attribute für die Verwendung mit beiden Serialisierungsprogrammen verfügt, wird in von semantisch identisches XML übersetzt die XmlSerializer und durch die DataContractAttribute:The following class, which has attributes for use with both of the serializers, is translated into semantically identical XML by the XmlSerializer and by the DataContractAttribute:

[Serializable]  
[XmlRoot(Namespace="urn:Contoso:2006:January:29")]  
[DataContract(Namespace="urn:Contoso:2006:January:29")]  
public class LineItem  
{  
     [DataMember]  
     public string ItemNumber;  
     [DataMember]  
     public decimal Quantity;  
     [DataMember]  
     public decimal UnitPrice;  
}  

Das Windows Software Development Kit (SDK) enthält ein Befehlszeilentool namens der ServiceModel Metadata Utility Tool (Svcutil.exe).The Windows software development kit (SDK) includes a command-line tool called the ServiceModel Metadata Utility Tool (Svcutil.exe). Das Tool xsd.exe mit ASP.NET-Webdiensten verwendet wie Svcutil.exe kann Definitionen von .NET-Typen für die Daten aus XML-Schema generieren.Like the xsd.exe tool used with ASP.NET Web services, Svcutil.exe can generate definitions of .NET data types from XML Schema. Bei den Typen handelt es sich um Datenverträge, sofern DataContractSerializer XML in dem vom XML-Schema definierten Format ausgeben kann; andernfalls sind sie für die Serialisierung mithilfe von XmlSerializer vorgesehen.The types are data contracts if the DataContractSerializer can emit XML in the format defined by the XML Schema; otherwise, they are intended for serialization using the XmlSerializer. Svcutil.exe kann auch ein XML-Schema aus Datenverträgen generieren, mit dessen dataContractOnly wechseln.Svcutil.exe can also generate an XML schema from data contracts by using its dataContractOnly switch.

Hinweis

Obwohl verwenden ASP.NET-Webdienste die XmlSerializer, und ASP.NET-Kompatibilitätsmodus von WCF ist WCF-Dienste, die das Verhalten von ASP.NET-Webdiensten zu imitieren, die die ASP.NET-Kompatibilitätsoption schränkt nicht mit einer der XmlSerializer.Although ASP.NET Web services use the XmlSerializer, and WCF ASP.NET compatibility mode makes WCF services mimic the behavior of ASP.NET Web services, the ASP.NET compatibility option does not restrict one to using the XmlSerializer. DataContractSerializer kann nach wie vor verwendet werden, während die Dienste im ASP.NET-Kompatibilitätsmodus ausgeführt werden.One can still use the DataContractSerializer with services running in the ASP.NET compatibility mode.

DienstentwicklungService Development

Soll ein Dienst mithilfe von ASP.NET entwickelt werden, wird einer Klasse üblicherweise das WebService-Attribut hinzugefügt, und WebMethodAttribute wird einer beliebigen Methode dieser Klasse, bei denen es sich um Vorgänge des Diensts handeln soll, hinzugefügt:To develop a service using ASP.NET, it has been customary to add the WebService attribute to a class, and the WebMethodAttribute to any of that class’ methods that are to be operations of the service:

[WebService]  
public class Service : T:System.Web.Services.WebService  
{  
    [WebMethod]  
    public string Echo(string input)   
    {  
       return input;  
    }  
}  

Seit ASP.NET 2.0 steht eine Option zur Verfügung, mit der der WebService und das WebMethodAttribute des Attributs einer Schnittstelle und nicht einer Klasse hinzugefügt werden und eine Klasse zum Implementieren der Schnittstelle geschrieben wird:ASP.NET 2.0 introduced the option of adding the attribute WebService and WebMethodAttribute to an interface rather than to a class, and writing a class to implement the interface:

[WebService]  
public interface IEcho  
{  
    [WebMethod]  
    string Echo(string input);  
}  

public class Service : IEcho  
{  

   public string Echo(string input)  
   {  
        return input;  
    }  
}  

Die Verwendung dieser Option wird empfohlen, da die Schnittstelle mit dem WebService-Attribut einen Vertrag für die vom Dienst ausgeführten Vorgänge darstellt. Dieser Vertrag kann erneut mit verschiedenen Klassen verwendet werden, die denselben Vertrag möglicherweise auf unterschiedliche Art und Weise implementieren.Using this option is to be preferred, because the interface with the WebService attribute constitutes a contract for the operations performed by the service that can be reused with various classes that might implement that same contract in different ways.

Ein WCF-Dienst wird durch die Definition von Endpunkten für einen oder mehrere WCF bereitgestellt.A WCF service is provided by defining one or more WCF endpoints. Ein Endpunkt wird durch eine Adresse, eine Bindung und einen Dienstvertrag definiert.An endpoint is defined by an address, a binding and a service contract. Die Adresse wird am Standort des Diensts definiert.The address defines where the service is located. Die Bindung gibt an, wie eine Kommunikation mit dem Dienst stattfindet.The binding specifies how to communicate with the service. Mit dem Dienstvertrag werden die Vorgänge, die der Dienst ausführen kann, definiert.The service contract defines the operations that the service can perform.

Der Dienstvertrag wird normalerweise zuerst definiert, indem einer Schnittstelle ServiceContractAttribute und OperationContractAttribute hinzugefügt werden:The service contract is usually defined first, by adding ServiceContractAttribute and OperationContractAttribute to an interface:

[ServiceContract]  
public interface IEcho  
{  
     [OperationContract]  
     string Echo(string input);  
}  

Die ServiceContractAttribute gibt an, dass die Schnittstelle einen WCF-Dienstvertrag definiert und die OperationContractAttribute gibt an, die, sofern vorhanden, der Methoden der Schnittstelle Vorgänge des Dienstvertrags definieren.The ServiceContractAttribute specifies that the interface defines a WCF service contract, and the OperationContractAttribute indicates which, if any, of the methods of the interface define operations of the service contract.

Nach der Definition eines Dienstvertrags wird dieser in einer Klasse implementiert, indem die Klasse die Schnittstelle implementiert, nach der der Dienstvertrag definiert ist:Once a service contract has been defined, it is implemented in a class, by having the class implement the interface by which the service contract is defined:

public class Service : IEcho  
{  
    public string Echo(string input)  
    {  
       return input;  
    }  
}  

Geben Sie als Dienst in WCF ist eine Klasse, die einen Dienstvertrag implementiert bezeichnet.A class that implements a service contract is referred to as a service type in WCF.

Der nächste Schritt besteht in der Zuordnung einer Adresse und einer Bindung zu einem Diensttyp.The next step is to associate an address and a binding with a service type. Dies geschieht normalerweise in einer Konfigurationsdatei, entweder durch Bearbeiten der Datei direkt oder mithilfe eines Konfigurations-Editors mit WCF bereitgestellt.That is typically done in a configuration file, either by editing the file directly, or by using a configuration editor provided with WCF. Hier sehen Sie ein Beispiel einer Konfigurationsdatei.Here is an example of a configuration file.

<?xml version="1.0" encoding="utf-8" ?>  
<configuration>  
     <system.serviceModel>  
      <services>  
      <service name="Service ">  
       <endpoint   
        address="EchoService"  
        binding="basicHttpBinding"  
        contract="IEchoService "/>  
      </service>  
      </services>  
     </system.serviceModel>  
</configuration>  

Die Bindung gibt den Satz der Protokolle für die Kommunikation mit der Anwendung an.The binding specifies the set of protocols for communicating with the application. In der folgenden Tabelle sind die vom System bereitgestellten Bindungen, die allgemeine Optionen darstellen, aufgeführt.The following table lists the system-provided bindings that represent common options.

NameName ZweckPurpose
BasicHttpBindingBasicHttpBinding Interoperabilität mit Webdiensten und Clients, die WS-BasicProfile 1.1 und Basic Security Profile 1.0 unterstützen.Interoperability with Web services and clients supporting the WS-BasicProfile 1.1 and Basic Security Profile 1.0.
WSHttpBindingWSHttpBinding Interoperabilität mit Webdiensten und Clients, die die Protokolle vom Typ WS-* über HTTP unterstützen.Interoperability with Web services and clients that support the WS-* protocols over HTTP.
WSDualHttpBindingWSDualHttpBinding Duplex-HTTP-Kommunikation, bei der der Empfänger einer ursprünglichen Nachricht nicht direkt dem ursprünglichen Absender antwortet, jedoch eine beliebige Anzahl von Antworten über einen bestimmten Zeitraum übertragen kann, indem er HTTP in Übereinstimmung mit WS-*-Protokollen verwendet.Duplex HTTP communication, by which the receiver of an initial message does not reply directly to the initial sender, but may transmit any number of responses over a period of time by using HTTP in conformity with WS-* protocols.
WSFederationBindingWSFederationBinding HTTP-Kommunikation, in der der Zugriff auf Ressourcen eines Diensts auf Basis der Anmeldeinformationen gesteuert wird, die von einem explizit identifizierten Anmeldeinformationsanbieter ausgestellt werden.HTTP communication, in which access to the resources of a service can be controlled based on credentials issued by an explicitly-identified credential provider.
NetTcpBindingNetTcpBinding Sichere, zuverlässige, leistungsstarke Kommunikation zwischen WCF--Softwareentitäten in einem Netzwerk.Secure, reliable, high-performance communication between WCF software entities across a network.
NetNamedPipeBindingNetNamedPipeBinding Sichere, zuverlässige, leistungsstarke Kommunikation zwischen WCF--Softwareentitäten auf demselben Computer.Secure, reliable, high-performance communication between WCF software entities on the same machine.
NetMsmqBindingNetMsmqBinding Die Kommunikation zwischen WCF-Softwareentitäten mithilfe von MSMQ.Communication between WCF software entities by using MSMQ.
MsmqIntegrationBindingMsmqIntegrationBinding Die Kommunikation zwischen einem WCF--Softwareentität und einer anderen Softwareentität mithilfe von MSMQ.Communication between a WCF software entity and another software entity by using MSMQ.
NetPeerTcpBindingNetPeerTcpBinding Die Kommunikation zwischen WCF--Softwareentitäten mithilfe von Windows-Peer-zu-Peer-Netzwerken.Communication between WCF software entities by using Windows Peer-to-Peer Networking.

Mit der vom System bereitgestellten Bindung, BasicHttpBinding, wird der Satz der von ASP.NET-Webdiensten unterstützten Protokolle integriert.The system-provided binding, BasicHttpBinding, incorporates the set of protocols supported by ASP.NET Web services.

Benutzerdefinierte Bindungen für WCF-Anwendungen können problemlos als Auflistungen von Elementklassen Bindung definiert, die WCF zum Implementieren einzelner Protokolle verwendet werden.Custom bindings for WCF applications are easily defined as collections of the binding element classes that WCF uses to implement individual protocols. Neue Bindungselemente können zur Darstellung zusätzlicher Protokolle geschrieben werden.New binding elements can be written to represent additional protocols.

Das interne Verhalten der Diensttypen kann mithilfe der Eigenschaften einer Klassenfamilie mit der Bezeichnung Verhaltensweisen angepasst werden.The internal behavior of service types can be adjusted using the properties of a family of classes called behaviors. Hier wird mit der ServiceBehaviorAttribute-Klasse angegeben, dass der Diensttyp Multithread sein soll.Here, the ServiceBehaviorAttribute class is used to specify that the service type is to be multithreaded.

[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple]  
public class DerivativesCalculatorServiceType: IDerivativesCalculator  

Einige Verhaltensweisen wie zum Beispiel ServiceBehaviorAttribute sind Attribute.Some behaviors, like ServiceBehaviorAttribute, are attributes. Andere Verhaltensweisen (diejenigen mit den Eigenschaften, die normalerweise von Administratoren festgelegt werden) können in der Konfiguration einer Anwendung geändert werden.Others, the ones with properties that administrators would want to set, can be modified in the configuration of an application.

In Programmierdiensttypen wird häufig die OperationContext-Klasse verwendet.In programming service types, frequent use is made of the OperationContext class. Die statische Current-Eigenschaft bietet Zugriff auf Informationen zu dem Kontext, in dem ein Vorgang ausgeführt wird.Its static Current property provides access to information about the context in which an operation is running. OperationContext ist für die Klassen HttpContext und ContextUtil ähnlich.OperationContext is similar to both the HttpContext and ContextUtil classes.

HostingHosting

ASP.NET-Webdienste werden in eine Klassenbibliothekassembly kompiliert.ASP.NET Web services are compiled into a class library assembly. Eine als Dienstdatei bezeichnete Datei wird bereitgestellt, die die Erweiterung ASMX aufweist und eine @ WebService-Richtlinie zur Identifizierung der Klasse mit dem Code für den Dienst und die Assembly beinhaltet, in der sich die Klasse befindet.A file called the service file is provided that has the extension .asmx and contains an @ WebService directive that identifies the class that contains the code for the service and the assembly in which it is located.

<%@ WebService Language="C#" Class="Service,ServiceAssembly" %>  

Die Dienstdatei wird in das Stammverzeichnis einer ASP.NET-Anwendung in Internetinformationsdienste (IIS) und die Assembly in das \bin-Unterverzeichnis dieses Anwendungsstammverzeichnisses kopiert.The service file is copied into an ASP.NET application root in Internet Information Services (IIS), and the assembly is copied into the \bin subdirectory of that application root. Die Anwendung ist anschließend durch Angabe der URL (Uniform Resource Locator) der Dienstdatei im Stammverzeichnis der Anwendung verfügbar.The application is then accessible by using the uniform resource locator (URL) of the service file in the application root.

WCF-Dienste können ohne weiteres gehostet werden, in IIS 5.1 oder 6.0, den Windows Process Activation Service (WAS), die als Teil von IIS 7.0, bereitgestellt wird und innerhalb einer beliebigen.WCF services can readily be hosted within IIS 5.1 or 6.0, the Windows Process Activation Service (WAS) that is provided as part of IIS 7.0, and within any .NET application. Soll ein Dienst in IIS 5.1 oder 6.0 gehostet werden, muss HTTP als Kommunikationstransportprotokoll verwendet werden.To host a service in IIS 5.1 or 6.0, the service must use HTTP as the communications transport protocol.

Soll ein Dienst innerhalb von IIS 5, 6.0 oder WAS gehostet werden, gehen Sie folgendermaßen vor:To host a service within IIS 5.1, 6.0 or within WAS, use the follows steps:

  1. Kompilieren Sie den Diensttyp in eine Klassenbibliothekassembly.Compile the service type into a class library assembly.

  2. Erstellen Sie eine Dienstdatei mit einer SVC-Erweiterung und einer @ ServiceHost-Richtlinie zur Identifizierung des Diensttyps:Create a service file with a .svc extension with an @ ServiceHost directive to identify the service type:

    <%@ServiceHost language="c#" Service="MyService" %>  
    
  3. Kopieren Sie die Dienstdatei in ein virtuelles Verzeichnis und die Assembly in das \bin-Unterverzeichnis des virtuellen Verzeichnisses.Copy the service file into a virtual directory, and the assembly into the \bin subdirectory of that virtual directory.

  4. Kopieren Sie die Konfigurationsdatei in das virtuelle Verzeichnis, und nennen Sie die Datei Web.config.Copy the configuration file into the virtual directory, and name it Web.config.

Die Anwendung ist anschließend durch Angabe der URL der Dienstdatei im Stammverzeichnis der Anwendung verfügbar.The application is then accessible by using the URL of the service file in the application root.

Zum Hosten eines WCF-Diensts in einer .NET-Anwendung kompilieren Sie den Diensttyp in eine klassenbibliothekassembly, auf die von der Anwendung verwiesen wird, und Programmieren Sie die Anwendung zum Hosten des Diensts mithilfe der ServiceHost Klasse.To host a WCF service within a .NET application, compile the service type into a class library assembly referenced by the application, and program the application to host the service using the ServiceHost class. Nachfolgend finden Sie ein Beispiel für die erforderliche grundlegende Programmierung:The following is an example of the basic programming required:

string httpBaseAddress = "http://www.contoso.com:8000/";  
string tcpBaseAddress = "net.tcp://www.contoso.com:8080/";  

Uri httpBaseAddressUri = new Uri(httpBaseAddress);  
Uri tcpBaseAddressUri = new Uri(tcpBaseAddress);  

Uri[] baseAdresses = new Uri[] {   
 httpBaseAddressUri,  
 tcpBaseAddressUri};  

using(ServiceHost host = new ServiceHost(  
typeof(Service), //"Service" is the name of the service type baseAdresses))  
{  
     host.Open();  

     […] //Wait to receive messages  
     host.Close();  
}  

In diesem Beispiel erfahren Sie, wie Adressen für mindestens ein Transportprotokoll bei der Erstellung von ServiceHost angegeben werden.This example shows how addresses for one or more transport protocols are specified in the construction of a ServiceHost. Diese Adressen werden als Basisadressen bezeichnet.These addresses are referred to as base addresses.

Die Adresse für einen beliebigen Endpunkt eines WCF-Diensts ist eine Adresse relativ zu einer Basisadresse des Endpunkthosts.The address provided for any endpoint of a WCF service is an address relative to a base address of the endpoint’s host. Der Host kann über eine Basisadresse für jedes Kommunikationstransportprotokoll verfügen.The host can have one base address for each communication transport protocol. In der Beispielkonfiguration in der vorangegangenen Konfigurationsdatei verwendet die für den Endpunkt gewählte BasicHttpBinding HTTP als Transportprotokoll, sodass die Adresse des Endpunkts (EchoService) relativ zur HTTP-Basisadresse des Hosts ist.In the sample configuration in the preceding configuration file, the BasicHttpBinding selected for the endpoint uses HTTP as the transport protocol, so the address of the endpoint, EchoService, is relative to the host’s HTTP base address. Im Fall des Hosts im vorhergehenden Beispiel, ist die HTTP-Basisadresse http://www.contoso.com:8000/.In the case of the host in the preceding example, the HTTP base address is http://www.contoso.com:8000/. Für einen in IIS oder WAS gehosteten Dienst ist die Basisadresse die URL der Dienstdatei des Diensts.For a service hosted within IIS or WAS, the base address is the URL of the service’s service file.

WCF--ASP.NET-kompatibilitätsmodusoption verwenden, können nur in IIS oder WAS und die mit HTTP als Transportprotokoll ausschließlich konfiguriert sind gehostete Diensten vorgenommen werden.Only services hosted in IIS or WAS, and which are configured with HTTP as the transport protocol exclusively, can be made to use WCF ASP.NET compatibility mode option. Das Aktivieren dieser Option erfordert die folgenden Schritte.Turning that option on requires the following steps.

  1. Der Programmierer muss das AspNetCompatibilityRequirementsAttribute-Attribut dem Diensttyp hinzufügen und angeben, dass der ASP.NET-Kompatibilitätsmodus entweder zulässig oder erforderlich ist.The programmer must add the AspNetCompatibilityRequirementsAttribute attribute to the service type and specify that ASP.NET compatibility mode is either allowed or required.

    [System.ServiceModel.Activation.AspNetCompatibilityRequirements(  
          RequirementsMode=AspNetCompatbilityRequirementsMode.Require)]  
    public class DerivativesCalculatorServiceType: IDerivativesCalculator  
    
  2. Der Administrator muss die Anwendung so konfigurieren, dass der ASP.NET-Kompatibilitätsmodus verwendet wird.The administrator must configure the application to use the ASP.NET compatibility mode.

    <configuration>  
         <system.serviceModel>  
          <services>  
          […]  
          </services>  
          <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>  
        </system.serviceModel>  
    </configuration>  
    

    WCF-Anwendungen können auch konfiguriert werden, um ASMX als Erweiterung für die Dienstdateien anstelle von SVC zu verwenden.WCF applications can also be configured to use .asmx as the extension for their service files rather than .svc.

    <system.web>  
         <compilation>  
          <compilation debug="true">  
          <buildProviders>  
           <remove extension=".asmx"/>  
           <add extension=".asmx"   
            type="System.ServiceModel.ServiceBuildProvider,   
            Systemm.ServiceModel,   
            Version=3.0.0.0,   
            Culture=neutral,   
            PublicKeyToken=b77a5c561934e089" />  
          </buildProviders>  
          </compilation>  
         </compilation>  
    </system.web>  
    

    Option speichern können Sie nicht mehr Clients zu ändern, die konfiguriert sind, um die URLs von ASMX-Dienstdateien verwenden, wenn Sie einen Dienst ändern WCF verwendet wird.That option can save you from having to modify clients that are configured to use the URLs of .asmx service files when modifying a service to use WCF.

CliententwicklungClient Development

Clients für ASP.NET-Webdienste werden mithilfe des Befehlszeilentools WSDL.exe generiert, das die URL der ASMX-Datei als Eingabe bereitstellt.Clients for ASP.NET Web services are generated using the command-line tool, WSDL.exe, which provides the URL of the .asmx file as input. Ist das entsprechende Tool durch WCF bereitgestellte ServiceModel Metadata Utility Tool (Svcutil.exe).The corresponding tool provided by WCF is ServiceModel Metadata Utility Tool (Svcutil.exe). Es wird ein Codemodul mit der Definition des Dienstvertrags und der Definition einer WCF-Clientklasse generiert.It generates a code module with the definition of the service contract and the definition of a WCF client class. Es generiert auch eine Konfigurationsdatei mit der Adresse und der Bindung des Diensts.It also generates a configuration file with the address and binding of the service.

Beim Programmieren eines Clients eines Remotediensts ist es in der Regel empfehlenswert, gemäß einem asynchronen Muster zu programmieren.In programming a client of a remote service it is generally advisable to program according to an asynchronous pattern. Der vom Tool WSDL.exe generierte Code beinhaltet standardmäßig sowohl ein synchrones als auch ein asynchrones Muster.The code generated by the WSDL.exe tool always provides for both a synchronous and an asynchronous pattern by default. Der vom generierte Code die ServiceModel Metadata Utility Tool (Svcutil.exe) können entweder Muster bereitstellen.The code generated by the ServiceModel Metadata Utility Tool (Svcutil.exe) can provide for either pattern. Standardmäßig wird das synchrone Muster bereitgestellt.It provides for the synchronous pattern by default. Bei Ausführung des Tools mit /async wird durch den generierten Code das asynchrone Muster bereitgestellt.If the tool is executed with the /async switch, then the generated code provides for the asynchronous pattern.

Es gibt keine Garantie, die Namen in den WCF-Clientklassen, die von ASP generiert. NET Tool WSDL.exe, standardmäßig den Namen in WCF-Clientklassen, die vom Tool Svcutil.exe generierte übereinstimmen.There is no guarantee that names in the WCF client classes generated by ASP.NET’s WSDL.exe tool, by default, match the names in WCF client classes generated by the Svcutil.exe tool. Insbesondere wird den Namen der Eigenschaften von Klassen, die mit XmlSerializer serialisiert werden müssen, standardmäßig die Suffixeigenschaft im vom Tool Svcutil.exe generierten Code zugewiesen. Beim Tool WSDL.exe ist dies nicht der Fall.In particular, the names of the properties of classes that have to be serialized using the XmlSerializer are, by default, given the suffix Property in the code generated by the Svcutil.exe tool, which is not the case with the WSDL.exe tool.

NachrichtendarstellungMessage Representation

Die Header der SOAP-Nachrichten, die von ASP.NET-Webdiensten gesendet und empfangen werden, können angepasst werden.The headers of the SOAP messages sent and received by ASP.NET Web services can be customized. Eine Klasse wird von SoapHeader abgeleitet, um die Struktur des Headers zu definieren. Anschließend wird mit SoapHeaderAttribute das Vorhandensein des Headers angezeigt.A class is derived from SoapHeader to define the structure of the header, and then the SoapHeaderAttribute is used to indicate the presence of the header.

public class SomeProtocol : SoapHeader  
{  
     public long CurrentValue;  
     public long Total;  
}  

[WebService]  
public interface IEcho  
{  
     SomeProtocol ProtocolHeader  
     {  
      get;  
     set;  
     }  

     [WebMethod]  
     [SoapHeader("ProtocolHeader")]  
     string PlaceOrders(PurchaseOrderType order);  
}  

public class Service: WebService, IEcho  
{  
     private SomeProtocol protocolHeader;  

     public SomeProtocol ProtocolHeader  
     {  
         get  
         {  
              return this.protocolHeader;  
         }  

         set  
         {  
              this.protocolHeader = value;  
         }  
     }  

     string PlaceOrders(PurchaseOrderType order)  
     {  
         long currentValue = this.protocolHeader.CurrentValue;  
     }  
}  

WCF bietet die Attribute MessageContractAttribute, MessageHeaderAttribute, und MessageBodyMemberAttribute die Struktur der SOAP-Nachrichten gesendet und Empfangen von einem Dienst beschreiben.The WCF provides the attributes, MessageContractAttribute, MessageHeaderAttribute, and MessageBodyMemberAttribute to describe the structure of the SOAP messages sent and received by a service.

[DataContract]  
public class SomeProtocol  
{  
     [DataMember]  
     public long CurrentValue;  
     [DataMember]  
     public long Total;  
}  

[DataContract]  
public class Item  
{  
     [DataMember]  
     public string ItemNumber;  
     [DataMember]  
     public decimal Quantity;  
     [DataMember]  
     public decimal UnitPrice;  
}  

[MessageContract]  
public class ItemMesage  
{  
     [MessageHeader]  
     public SomeProtocol ProtocolHeader;  
     [MessageBody]  
     public Item Content;  
}  

[ServiceContract]  
public interface IItemService  
{  
     [OperationContract]  
     public void DeliverItem(ItemMessage itemMessage);  
}  

Diese Syntax ermöglicht eine explizite Darstellung der Nachrichtenstruktur, wohingegen die Struktur der Nachrichten vom Code eines ASP.NET-Webdiensts impliziert wird.This syntax yields an explicit representation of the structure of the messages, whereas the structure of messages is implied by the code of an ASP.NET Web service. Auch in der ASP.NET-Syntax Nachrichtenheader werden dargestellt als Eigenschaften des Diensts, z. B. die ProtocolHeader Eigenschaft im vorherigen Beispiel, wohingegen in WCF-Syntax ist genauer als Nachrichteneigenschaften dargestellt werden.Also, in the ASP.NET syntax, message headers are represented as properties of the service, such as the ProtocolHeader property in the previous example, whereas in WCF syntax, they are more accurately represented as properties of messages. Außerdem ermöglicht WCF Nachrichtenheadern an der Konfiguration von Endpunkten hinzugefügt werden.Also, WCF allows message headers to be added to the configuration of endpoints.

<service name="Service ">  
     <endpoint   
      address="EchoService"  
      binding="basicHttpBinding"  
      contract="IEchoService ">  
      <headers>  
      <dsig:X509Certificate   
       xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">  
       ...  
      </dsig:X509Certificate>  
      </headers>  
     </endpoint>  
</service>  

Mit dieser Option muss im Code für einen Client oder Dienst kein Verweis auf infrastrukturbezogene Protokollheader angegeben werden: Die Header werden Nachrichten ausgehend von der Konfiguration des Endpunkts hinzugefügt.That option allows you to avoid any reference to infrastructural protocol headers in the code for a client or service: the headers are added to messages because of how the endpoint is configured.

DienstbeschreibungService Description

Bei einer HTTP GET-Anforderung für die ASMX-Datei eines ASP.NET-Webdiensts mit der Abfrage-WSDL generiert ASP.NET zur Beschreibung des Diensts WSDL.Issuing an HTTP GET request for the .asmx file of an ASP.NET Web service with the query WSDL causes ASP.NET to generate WSDL to describe the service. Diese WSDL wird als Antwort auf diese Anforderung zurückgegeben.It returns that WSDL as the response to the request.

Mit ASP.NET 2.0 kann überprüft werden, ob ein Dienst mit Basic Profile 1.1 von Web Services-Interoperability Organization (WS-I) kompatibel ist und ein Anspruch, mit dem der Dienst kompatibel ist, in WSDL eingefügt werden.ASP.NET 2.0 made it possible to validate that a service is compliant with the Basic Profile 1.1 of the Web Services-Interoperability Organization (WS-I), and to insert a claim that the service is compliant into its WSDL. Dies wird mithilfe des ConformsTo-Parameters und des EmitConformanceClaims-Parameters des WebServiceBindingAttribute-Attributs durchgeführt.That is done using the ConformsTo and EmitConformanceClaims parameters of the WebServiceBindingAttribute attribute.

[WebService(Namespace = "http://tempuri.org/")]  
[WebServiceBinding(  
     ConformsTo = WsiProfiles.BasicProfile1_1,  
     EmitConformanceClaims=true)]  
public interface IEcho  

Die WSDL, die ASP.NET für einen Dienst generiert, kann angepasst werden.The WSDL that ASP.NET generates for a service can be customized. Anpassungen werden durch Erstellen einer abgeleiteten Klasse von ServiceDescriptionFormatExtension vorgenommen, um der WSDL Elemente hinzuzufügen.Customizations are made by creating a derived class of ServiceDescriptionFormatExtension to add items to the WSDL.

Geben eine HTTP-GET-Anforderung mit dem Abfrage-WSDL für die SVC-Datei eines WCF-Diensts mit einem HTTP-Endpunkt in IIS 5.1 gehostet, bewirkt, dass 6.0 oder WAS WCF antwortet mit WSDL, um den Dienst zu beschreiben.Issuing an HTTP GET request with the query WSDL for the .svc file of a WCF service with an HTTP endpoint hosted within IIS 51, 6.0 or WAS causes WCF to respond with WSDL to describe the service. Das Richten einer HTTP GET-Anforderung mit der Abfrage-WSDL an die HTTP-Basisadresse eines in einer .NET-Anwendung gehosteten Diensts hat die gleiche Auswirkung, wenn "httpGetEnabled" auf "true" festgelegt ist.Issuing an HTTP GET request with the query WSDL to the HTTP base address of a service hosted within a .NET application has the same effect if httpGetEnabled is set to true.

WCF reagiert jedoch auch auf WS-MetadataExchange-Anforderungen mit WSDL, die sie generiert, um einen Dienst zu beschreiben.However, WCF also responds to WS-MetadataExchange requests with WSDL that it generates to describe a service. ASP.NET-Webdienste verfügen über keine integrierte Unterstützung für WS-MetadataExchange-Anforderungen.ASP.NET Web services do not have built-in support for WS-MetadataExchange requests.

WCF generierten WSDL kann umfassend angepasst werden.The WSDL that WCF generates can be extensively customized. Die ServiceMetadataBehavior-Klasse bietet einige Funktionen zum Anpassen der WSDL.The ServiceMetadataBehavior class provides some facilities for customizing the WSDL. Die WCF kann auch auf WSDL nicht generiert, sondern verwenden Sie eine statische WSDL-Datei an einer angegebenen URL konfiguriert werden.The WCF can also be configured to not generate WSDL, but rather to use a static WSDL file at a given URL.

<behaviors>  
     <behavior name="DescriptionBehavior">  
     <metadataPublishing   
      enableMetadataExchange="true"   
      enableGetWsdl="true"   
      enableHelpPage="true"   
      metadataLocation=  
      "http://localhost/DerivativesCalculatorService/Service.WSDL"/>  
     </behavior>  
</behaviors>  

AusnahmebehandlungException Handling

In ASP.NET-Webdiensten werden nicht behandelte Ausnahmen den Clients als SOAP-Fehler zurückgegeben.In ASP.NET Web services, unhandled exceptions are returned to clients as SOAP faults. Sie können auch explizit Instanzen der SoapException-Klasse auslösen und eine größere Kontrolle über den Inhalt des SOAP-Fehlers erlangen, der an den Client übertragen wird.You can also explicitly throw instances of the SoapException class and have more control over the content of the SOAP fault that gets transmitted to the client.

In WCF-Dienste werden nicht behandelte Ausnahmen nicht an Clients als SOAP-Fehler, um zu verhindern, dass vertrauliche Informationen, die durch die Ausnahmen unbeabsichtigte zurückgegeben.In WCF services, unhandled exceptions are not returned to clients as SOAP faults to prevent sensitive information being inadvertently exposed through the exceptions. Mit einer Konfigurationseinstellung werden nicht behandelte Ausnahmen zu Debugging-Zwecken an Clients zurückgegeben.A configuration setting is provided to have unhandled exceptions returned to clients for the purpose of debugging.

Sollen SOAP-Fehler an Clients zurückgegeben werden, können Instanzen des generischen Typs (FaultException<TDetail>) unter Verwendung des Datenvertragstyps als generischem Typ ausgelöst werden.To return SOAP faults to clients, you can throw instances of the generic type, FaultException<TDetail>, using the data contract type as the generic type. Sie können auch FaultContractAttribute-Attribute Vorgängen hinzufügen, um die Fehler anzugeben, die sich aus einem Vorgang ergeben können.You can also add FaultContractAttribute attributes to operations to specify the faults that an operation might yield.

[DataContract]  
public class MathFault  
{   
     [DataMember]  
     public string operation;  
     [DataMember]  
     public string problemType;  
}  

[ServiceContract]  
public interface ICalculator  
{  
     [OperationContract]  
     [FaultContract(typeof(MathFault))]  
     int Divide(int n1, int n2);  
}  

Dies führt dazu, dass mögliche Fehler in der WSDL für den Dienst angekündigt werden und Clientprogrammierer somit vorab wissen, welche Fehler sich aus einem Vorgang ergeben können. Auf Grundlage dieser Ankündigung haben die Programmierer die Möglichkeit, geeignete catch-Anweisungen zu verfassen.Doing so results in the possible faults being advertised in the WSDL for the service, allowing client programmers to anticipate which faults can result from an operation, and write the appropriate catch statements.

try  
{  
     result = client.Divide(value1, value2);  
}  
catch (FaultException<MathFault> e)  
{  
 Console.WriteLine("FaultException<MathFault>: Math fault while doing "  
  + e.Detail.operation   
  + ". Problem: "   
  + e.Detail.problemType);  
}  

ZustandsverwaltungState Management

Die Klasse, mit der ein ASP.NET-Webdienst implementiert wird, wird möglicherweise von WebService abgeleitet.The class used to implement an ASP.NET Web service may be derived from WebService.

public class Service : WebService, IEcho  
{  

 public string Echo(string input)  
 {  
  return input;  
 }  
}  

In diesem Fall kann die Klasse so programmiert werden, dass sie die WebService-Kontexteigenschaft der Basisklasse für den Zugriff auf ein HttpContext-Objekt verwendet.In that case, the class can be programmed to use the WebService base class’ Context property to access a HttpContext object. Mit dem HttpContext-Objekt können Anwendungszustandsinformationen durch Verwendung der Anwendungseigenschaft aktualisiert und abgerufen werden. Außerdem können Sitzungszustandsinformationen durch Verwendung der Sitzungseigenschaft aktualisiert und abgerufen werden.The HttpContext object can be used to update and retrieve application state information by using its Application property, and can be used to update and retrieve session state information by using its Session property.

ASP.NET bietet umfassende Funktionen zur Bestimmung des tatsächlichen Speicherorts der Sitzungszustandsinformationen, auf die mithilfe der Sitzungseigenschaft von HttpContext zugegriffen wird.ASP.NET provides considerable control over where the session state information accessed by using the Session property of the HttpContext is actually stored. Die Informationen können in Cookies, einer Datenbank, im Speicher des aktuellen Servers oder im Speicher eines festgelegten Servers gespeichert sein.It may be stored in cookies, in a database, in the memory of the current server, or in the memory of a designated server. Die Auswahl wird in der Konfigurationsdatei des Diensts getroffen.The choice is made in the service’s configuration file.

WCF bietet erweiterbare Objekte für die Zustandsverwaltung.The WCF provides extensible objects for state management. Erweiterbare Objekte sind Objekte, mit denen IExtensibleObject<T> implementiert wird.Extensible objects are objects that implement IExtensibleObject<T>. Die wichtigsten erweiterbaren Objekte sind ServiceHostBase und InstanceContext.The most important extensible objects are ServiceHostBase and InstanceContext. ServiceHostBase ermöglicht die Beibehaltung des Zustands, auf den alle Instanzen aller Diensttypen auf demselben Host zugreifen können, während InstanceContext das Beibehalten des Zustands ermöglicht, auf den mit jedem Code, der in derselben Instanz eines Diensttyps ausgeführt wird, zugegriffen werden kann.ServiceHostBase allows you to maintain state that all of the instances of all of the service types on the same host can access, while InstanceContext allows you to maintain state that can be accessed by any code running within the same instance of a service type.

Hier wird der Diensttyp TradingSystem, verfügt über eine ServiceBehaviorAttribute , der angibt, dass alle Aufrufe von der gleichen Instanz des WCF-Client mit der gleichen Instanz des Diensttyps weitergeleitet werden.Here, the service type, TradingSystem, has a ServiceBehaviorAttribute that specifies that all calls from the same WCF client instance are routed to the same instance of the service type.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]  
public class TradingSystem: ITradingService  

Die Klasse (DealData) definiert den Zustand, auf den mit jedem Code, der in derselben Instanz eines Diensttyps ausgeführt wird, zugegriffen wird.The class, DealData, defines state that can be accessed by any code running in the same instance of a service type.

internal class DealData: IExtension<InstanceContext>  
{  
 public string DealIdentifier = null;  
 public Trade[] Trades = null;  
}  

Im Code des Diensttyps, mit dem einer der Vorgänge des Dienstvertrags implementiert wird, wird ein DealData-Statusobjekt dem Zustand der aktuellen Instanz des Diensttyps hinzugefügt.In the code of the service type that implements one of the operations of the service contract, a DealData state object is added to the state of the current instance of the service type.

string ITradingService.BeginDeal()  
{  
 string dealIdentifier = Guid.NewGuid().ToString();  
 DealData state = new DealData(dealIdentifier);  
 OperationContext.Current.InstanceContext.Extensions.Add(state);  
 return dealIdentifier;  
}  

Das Statusobjekt kann anschließend mit dem Code abgerufen und geändert werden, der einen anderen Dienstvertragsvorgang implementiert.That state object can then be retrieved and modified by the code that implements another of the service contract’s operations.

void ITradingService.AddTrade(Trade trade)  
{  
 DealData dealData =  OperationContext.Current.InstanceContext.Extensions.Find<DealData>();  
 dealData.AddTrade(trade);  
}  

Während ASP.NET ermöglicht, in denen der Zustandsinformationen in der HttpContext -Klasse wird tatsächlich gespeichert, WCF, mindestens in der Ausgangsversion bietet keine Kontrolle darüber, wo der erweiterbaren Objekte gespeichert werden.Whereas ASP.NET provides control over where state information in the HttpContext class is actually stored, WCF, at least in its initial version, provides no control over where extensible objects are stored. Bilden, den besten Grund für die Auswahl des ASP.NET-Kompatibilitätsmodus für einen WCF-Dienst.That constitutes the very best reason for selecting the ASP.NET compatibility mode for a WCF service. Sofern eine konfigurierbare Zustandsverwaltung erforderlich ist, können Sie mit dem ASP.NET-Kompatibilitätsmodus die Funktionen der HttpContext-Klasse genau entsprechend ihrer Verwendung in ASP.NET nutzen und zudem den Speicherort der Zustandsinformationen konfigurieren, die mithilfe der HttpContext-Klasse verwaltet werden.If configurable state management is imperative, then opting for the ASP.NET compatibility mode allows you to use the facilities of the HttpContext class exactly as they are used in ASP.NET, and also to configure where state information managed by using the HttpContext class is stored.

SicherheitSecurity

Die Optionen für das Sichern der ASP.NET-Webdienste stimmen mit den Optionen für das Sichern einer beliebigen IIS-Anwendung überein.The options for securing ASP.NET Web services are those for securing any IIS application. Da WCF-Anwendungen nicht nur innerhalb von IIS, sondern auch in eine beliebige .NET ausführbare Datei gehostet werden können, müssen die Optionen für das Sichern von WCF-Anwendungen unabhängig von den Funktionen von IIS ausgeführt werden.Because WCF applications can be hosted not only within IIS but also within any .NET executable, the options for securing WCF applications must be made independent from the facilities of IIS. Die für ASP.NET-Webdienste bereitgestellten Funktionen sind jedoch auch für WCF-Dienste im ASP.NET-Kompatibilitätsmodus ausgeführt verfügbar.However, the facilities provided for ASP.NET Web services are also available for WCF services running in ASP.NET compatibility mode.

Sicherheit: AuthentifizierungSecurity: Authentication

IIS bietet Funktionen für die Steuerung des Zugriffs auf Anwendungen, mit denen Sie entweder anonymen Zugriff oder eine Reihe von Authentifizierungsmodi auswählen können: Windows-Authentifizierung, Digestauthentifizierung, Standardauthentifizierung und .NET Passport-Authentifizierung.IIS provides facilities for controlling access to applications by which you can select either anonymous access or a variety of modes of authentication: Windows Authentication, Digest Authentication, Basic Authentication, and .NET Passport Authentication. Die Option Windows-Authentifizierung kann verwendet werden, um Zugriff auf ASP.NET-Webdienste zu steuern.The Windows Authentication option can be used to control access to ASP.NET Web services. Wenn WCF-Anwendungen in IIS gehostet werden, muss die IIS konfiguriert um anonymen Zugriff zu gestatten, an die Anwendung so, dass die Authentifizierung über WCF selbst verwaltet werden kann, die Windows-Authentifizierung neben zahlreichen anderen Optionen unterstützt wird.However, when WCF applications are hosted within IIS, IIS must be configured to permit anonymous access to the application, so that authentication can be managed by WCF itself, which does support Windows authentication among various other options. Zu den anderen integrierten Optionen zählen Benutzernamentoken, X.509-Zertifikate, SAML-Token und CardSpace-Karten, doch es können auch benutzerdefinierte Authentifizierungsmechanismen definiert werden.The other options that are built-in include username tokens, X.509 certificates, SAML tokens, and CardSpace card, but custom authentication mechanisms can also be defined.

Sicherheit: IdentitätswechselSecurity: Impersonation

ASP.NET verfügt über ein Identitätselement, mit dem ein ASP.NET-Webdienst für das Durchführen von Identitätswechseln konfiguriert werden kann, und zwar für einen bestimmten Benutzer oder einen beliebigen Benutzer, für den in der aktuellen Anforderung Anmeldeinformationen angegeben werden.ASP.NET provides an identity element by which an ASP.NET Web service can be made to impersonate a particular user or whichever user’s credentials are provided with the current request. Dieses Element kann verwendet werden, so konfigurieren Sie den Identitätswechsel in WCF-Anwendungen, die im ASP.NET-Kompatibilitätsmodus ausgeführt werden kann.That element can be used to configure impersonation in WCF applications running in ASP.NET compatibility mode.

Das WCF-Konfigurationssystem bietet einen eigenen Identitätselement zum Kennzeichnen eines bestimmten Benutzers für den Identitätswechsel.The WCF configuration system provides its own identity element for designating a particular user to impersonate. Darüber hinaus können WCF-Clients und-Dienste unabhängig für Identitätswechsel konfiguriert werden.Also, WCF clients and services can be independently configured for impersonation. Clients können dafür konfiguriert werden, für den aktuellen Benutzer beim Übertragen von Anforderungen einen Identitätswechsel durchzuführen.Clients can be configured to impersonate the current user when they transmit requests.

<behaviors>  
     <behavior name="DerivativesCalculatorClientBehavior">  
      <clientCredentials>  
      <windows allowedImpersonationLevel="Impersonation"/>  
      </clientCredentials>  
     </behavior>  
</behaviors>  

Dienstvorgänge können dafür konfiguriert werden, einen Identitätswechsel für einen beliebigen Benutzer durchzuführen, dessen Anmeldeinformationen in der aktuellen Anforderung angegeben werden.Service operations can be configured to impersonate whichever user’s credentials are provided with the current request.

[OperationBehavior(Impersonation = ImpersonationOption.Required)]  
public void Receive(Message input)  

Sicherheit: Autorisierung mithilfe von ZugriffssteuerungslistenSecurity: Authorization using Access Control Lists

Mit Zugriffssteuerungslisten (ACLs) kann der Zugriff auf ASMX-Dateien beschränkt werden.Access Control Lists (ACLs) can be used to restrict access to .asmx files. Allerdings werden ACLs für WCF-SVC-Dateien mit Ausnahme im ASP.NET-Kompatibilitätsmodus ignoriert.However, ACLs on WCF .svc files are ignored except in ASP.NET compatibility mode.

Sicherheit: Rollenbasierte AutorisierungSecurity: Role-based Authorization

Die Option für Windows-Authentifizierung in IIS kann zusammen mit dem von der ASP.NET-Konfigurationssprache bereitgestellten Autorisierungselement verwendet werden, um rollenbasierte Autorisierung für ASP.NET-Webdienste auf Grundlage der Windows-Gruppen, denen Benutzer zugewiesen sind, zu erleichtern.The IIS Windows Authentication option can be used in conjunction with the authorization element provided by the ASP.NET configuration language to facilitate role-based authorization for ASP.NET Web services based on the Windows groups to which users are assigned. ASP.NET 2.0 verwendet einen allgemeineren rollenbasierten Autorisierungsmechanismus: Rollenanbieter.ASP.NET 2.0 introduced a more general role-based authorization mechanism: role providers.

Rollenanbieter sind Klassen, die alle eine Basisschnittstelle für die Abfrage der Rollen, denen ein Benutzer zugewiesen ist, implementieren. Allerdings können diese Informationen mit jedem Rollenanbieter von einer anderen Quelle abgerufen werden.Role providers are classes that all implement a basic interface for enquiring about the roles to which a user is assigned, but each role provider knows how to retrieve that information from a different source. ASP.NET 2.0 verfügt über einen Rollenanbieter zum Abrufen von Rollenzuweisungen von einer Microsoft SQL Server-Datenbank und einen weiteren Rollenanbieter zum Abrufen von Rollenzuweisungen vom Windows Server 2003-Autorisierungs-Manager.ASP.NET 2.0 provides a role provider that can retrieve role assignments from a Microsoft SQL Server database, and another that can retrieve role assignments from the Windows Server 2003 Authorization Manager.

Die Rolle Anbieter Mechanismus kann tatsächlich unabhängig von ASP.NET in jeder .NET-Anwendung, einschließlich einer WCF-Anwendung verwendet werden.The role provider mechanism can actually be used independently of ASP.NET in any .NET application, including a WCF application. Der folgenden Beispielkonfiguration für eine WCF-Anwendung zeigt, wie die Verwendung des ASP.NET-Rollenanbieters anhand der ausgewählten Option wird die ServiceAuthorizationBehavior.The following sample configuration for a WCF application shows how the use of an ASP.NET role provider is an option selected by means of the ServiceAuthorizationBehavior.

<system.serviceModel>  
     <services>  
         <service name="Service.ResourceAccessServiceType"   
             behaviorConfiguration="ServiceBehavior">  
             <endpoint   
              address="ResourceAccessService"   
              binding="wsHttpBinding"   
              contract="Service.IResourceAccessContract"/>  
         </service>  
     </services>  
     <behaviors>  
       <behavior name="ServiceBehavior">  
       <serviceAuthorization principalPermissionMode="UseAspNetRoles"/>  
      </behavior>  
     </behaviors>  
</system.serviceModel>  

Sicherheit: Anspruchbasierte AutorisierungSecurity: Claims-based Authorization

Einer der wichtigsten Innovationen von WCF ist die weit reichende Unterstützung zum Autorisieren des Zugriffs auf geschützte Ressourcen basierend auf Ansprüchen.One of the most important innovations of WCF is its thorough support for authorizing access to protected resources based on claims. Ansprüche bestehen beispielsweise aus einem Typ, einem Recht, einem Wert sowie einer Treiberlizenz.Claims consist of a type, a right and a value, a drivers’ license, for example. Ein Satz von Ansprüchen bezüglich des Trägers wird erstellt. Einer dieser Ansprüche ist das Geburtsdatum des Trägers.It makes a set of claims about the bearer, one of which is the bearer’s date of birth. Der Typ des Anspruchs ist das Geburtsdatum, wohingegen der Wert des Anspruchs das Geburtsdatum des Treibers ist.The type of that claim is date of birth, while the value of the claim is the driver’s birth date. Das Recht, das ein Anspruch einem Träger überträgt, gibt an, wozu der Träger den Wert des Anspruchs verwenden kann.The right that a claim confers on the bearer specifies what the bearer can do with the claim’s value. Beim Anspruch des Treibergeburtsdatums ist das Recht der Besitz: Der Treiber besitzt dieses Geburtsdatum, kann es jedoch nicht ändern.In the case of the claim of the driver’s date of birth, the right is possession: the driver possesses that date of birth but cannot, for example, alter it. Anspruchbasierte Autorisierung umfasst rollenbasierte Autorisierung, da Rollen ein Anspruchstyp sind.Claims-based authorization encloses role-based authorization, because roles are a type of claim.

Bei der anspruchbasierten Autorisierung wird ein Anspruchsatz mit den Zugriffsanforderungen des Vorgangs verglichen. Dabei wird der Zugriff auf den Vorgang abhängig vom Ergebnis dieses Vergleichs gewährt oder verweigert.Authorization based on claims is accomplished by comparing a set of claims to the access requirements of the operation and, depending on the outcome of that comparison, granting or denying access to the operation. In WCF, können Sie angeben, eine Klasse zu verwenden, um anspruchsbasierte Autorisierung erneut auszuführen, durch Zuweisen eines Werts, der ServiceAuthorizationManager Eigenschaft ServiceAuthorizationBehavior.In WCF, you can specify a class to use to run claims-based authorization, once again by assigning a value to the ServiceAuthorizationManager property of ServiceAuthorizationBehavior.

<behaviors>  
     <behavior name='ServiceBehavior'>  
     <serviceAuthorization   
     serviceAuthorizationManagerType=  
                   'Service.AccessChecker, Service' />  
     </behavior>  
</behaviors>  

Klassen, die zum Ausführen anspruchsbasierter Autorisierung verwendet werden, müssen von ServiceAuthorizationManager abgeleitet werden, der nur eine Methode zum Überschreiben besitzt (AccessCheck()).Classes used to run claims-based authorization must derive from ServiceAuthorizationManager, which has just one method to override, AccessCheck(). WCF ruft diese Methode auf, wenn ein Vorgang des Diensts aufgerufen wird, und bietet eine OperationContext -Objekt, das die Ansprüche für den Benutzer wurde in seiner ServiceSecurityContext.AuthorizationContext Eigenschaft.WCF calls that method whenever an operation of the service is invoked and provides a OperationContext object, which has the claims for the user in its ServiceSecurityContext.AuthorizationContext property. WCF assembliert die Ansprüche bezüglich des Benutzers aus der Sicherheitstoken wird vom Benutzer zur Authentifizierung angegebenen der Aufgabe zu bewerten, ob diese Ansprüche für den entsprechenden Vorgang ausreichend.WCF does the work of assembling claims about the user from whatever security token the user provided for authentication, which leaves the of task of evaluating whether those claims suffice for the operation in question.

WCF automatisch Ansprüche aus jeder Art von Sicherheit assembliert ist token eine überaus bedeutende Innovation, da der Code für die Autorisierung basierend auf den Ansprüchen, die vom Authentifizierungsmechanismus vollständig unabhängig ist.That WCF automatically assembles claims from any kind of security token is a highly significant innovation, because it makes the code for authorization based on the claims entirely independent of the authentication mechanism. Im Gegensatz dazu ist die Autorisierung mit Zugriffssteuerungslisten oder Rollen in ASP.NET eng an die Windows-Authentifizierung gebunden.By contrast, authorization using ACLs or roles in ASP.NET is closely tied to Windows authentication.

Sicherheit: VertraulichkeitSecurity: Confidentiality

Die Vertraulichkeit von Nachrichten, die mit ASP.NET-Webdiensten ausgetauscht werden, kann auf Transportebene dadurch sichergestellt werden, dass die Anwendung in IIS für die Verwendung von Secure Hypertext Transfer Protocol (HTTPS) konfiguriert wird.The confidentiality of messages exchanged with ASP.NET Web services can be ensured at the transport level by configuring the application within IIS to use the Secure Hypertext Transfer Protocol (HTTPS). Die gleiche kann für in IIS gehostete WCF-Anwendungen ausgeführt werden.The same can be done for WCF applications hosted within IIS. Außerhalb von IIS gehostete WCF-Anwendungen können jedoch auch so konfiguriert werden, zum Verwenden eines sicheren Transportprotokolls.However, WCF applications hosted outside of IIS can also be configured to use a secure transport protocol. Noch wichtiger ist WCF-Anwendungen um die Nachrichten zu sichern, bevor sie mit dem WS-Security-Protokoll transportiert werden, auch konfiguriert werden können.More important, WCF applications can also be configured to secure the messages before they are transported, using the WS-Security protocol. Wird nur der Text einer Nachricht mithilfe von WS-Sicherheit gesichert, ist eine vertrauliche Übertragung über Vermittler möglich, bevor das endgültige Ziel erreicht wird.Securing just the body of a message using WS-Security allows it to be transmitted confidentially across intermediaries before reaching its final destination.

GlobalisierungGlobalization

Die ASP.NET-Konfigurationssprache ermöglicht das Angeben der Kultur einzelner Dienste.The ASP.NET configuration language allows you to specify the culture for individual services. WCF unterstützt diese Konfigurationseinstellung nur im ASP.NET-Kompatibilitätsmodus nicht.The WCF does not support that configuration setting except in ASP.NET compatibility mode. Um einen WCF-Dienst zu lokalisieren, der keine ASP.NET-Kompatibilitätsmodus verwendet, kompilieren Sie den Diensttyp in kulturspezifische Assemblys und verfügen über separate kulturspezifische Endpunkte für jede kulturspezifische Assembly.To localize a WCF service that does not use ASP.NET compatibility mode, compile the service type into culture-specific assemblies, and have separate culture-specific endpoints for each culture-specific assembly.

Siehe auchSee Also

Vergleichen von ASP.NET-Webdiensten mit WCF nach Zweck und verwendeten StandardsComparing ASP.NET Web Services to WCF Based on Purpose and Standards Used