Vorgehensweise: Festlegen der ProtectionLevel-EigenschaftHow to: Set the ProtectionLevel Property

Sie können die Schutzebene festlegen, indem Sie ein entsprechendes Attribut anwenden und die Eigenschaft einrichten.You can set the protection level by applying an appropriate attribute and setting the property. Sie können den Schutz auf Dienstebene einrichten, um alle Teile einer Nachricht anzupassen. Darüber hinaus können Sie den Schutz auf stärker unterteilten Ebenen einrichten – von den Methoden zu den Nachrichtenteilen.You can set protection at the service level to affect all parts of every message, or you can set protection at increasingly granular levels, from methods to message parts. Weitere Informationen zu den ProtectionLevel -Eigenschaft, finden Sie unter Verständnis Schutzebene.For more information about the ProtectionLevel property, see Understanding Protection Level.

Hinweis

Schutzebenen können nur im Code, nicht in der Konfiguration festgelegt werden.You can set protection levels only in code, not in configuration.

So signieren Sie alle Nachrichten für einen DienstTo sign all messages for a service

  1. Erstellen Sie eine Schnittstelle für den Dienst.Create an interface for the service.

  2. Wenden Sie das ServiceContractAttribute-Attribut für den Dienst an, und legen Sie die ProtectionLevel-Eigenschaft auf Sign fest. Dies wird im folgenden Code veranschaulicht (die Standardebene ist EncryptAndSign).Apply the ServiceContractAttribute attribute to the service and set the ProtectionLevel property to Sign, as shown in the following code (the default level is EncryptAndSign).

    // Set the ProtectionLevel on the whole service to Sign.
    [ServiceContract(ProtectionLevel = ProtectionLevel.Sign)]
    public interface ICalculator
    
    ' Set the ProtectionLevel on the whole service to Sign.
    <ServiceContract(ProtectionLevel:=ProtectionLevel.Sign)> _
    Public Interface ICalculator
    

So signieren Sie alle Nachrichtenteile für einen VorgangTo sign all message parts for an operation

  1. Erstellen Sie eine Schnittstelle für den Dienst, und wenden Sie das ServiceContractAttribute-Attribut auf die Schnittstelle an.Create an interface for the service and apply the ServiceContractAttribute attribute to the interface.

  2. Fügen Sie der Schnittstelle eine Methodendeklaration hinzu.Add a method declaration to the interface.

  3. Wenden Sie das OperationContractAttribute-Attribut auf die Methode an, und setzen Sie die ProtectionLevel-Eigenschaft auf Sign. Dies wird im folgenden Code veranschaulicht.Apply the OperationContractAttribute attribute to the method, and set the ProtectionLevel property to Sign, as shown in the following code.

    // Set the ProtectionLevel on the whole service to Sign.
    [ServiceContract(ProtectionLevel = ProtectionLevel.Sign)]
    public interface ICalculator
    {
    
        // Set the ProtectionLevel on this operation to None.
        [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
        double Add(double a, double b);
    }
    
    ' Set the ProtectionLevel on the whole service to Sign.
    <ServiceContract(ProtectionLevel:=ProtectionLevel.Sign)> _
    Public Interface ICalculator
    
        ' Set the ProtectionLevel on this operation to Sign.
        <OperationContract(ProtectionLevel:=ProtectionLevel.Sign)> _
        Function Add(ByVal a As Double, ByVal b As Double) As Double
    End Interface
    

Schützen von FehlernachrichtenProtecting Fault Messages

Ausnahmen, die für einen Dienst ausgelöst werden, können als SOAP-Fehler an einen Client gesendet werden.Exceptions that are thrown on a service can be sent to a client as SOAP faults. Weitere Informationen zum Erstellen von stark Fehler eingegeben haben, finden Sie unter angeben und Behandeln von Fehlern in Verträgen und Diensten und wie: Deklarieren von Fehlern in Dienstverträgen.For more information about creating strongly typed faults, see Specifying and Handling Faults in Contracts and Services and How to: Declare Faults in Service Contracts.

So schützen Sie eine FehlernachrichtTo protect a fault message

  1. Erstellen Sie einen Typ, der die Fehlernachricht darstellt.Create a type that represents the fault message. Das folgende Beispiel erstellt eine Klasse mit dem Namen MathFault und zwei Feldern.The following example creates a class named MathFault with two fields.

  2. Wenden Sie das DataContractAttribute-Attribut auf den Typ und das DataMemberAttribute-Attribut für jedes Feld an, das serialisiert werden soll. Der folgende Code veranschaulicht dies.Apply the DataContractAttribute attribute to the type and a DataMemberAttribute attribute to each field that should be serialized, as shown in the following code.

    [DataContract]
    public class MathFault
    {
        [DataMember]
        public string operation;
        [DataMember]
        public string description;
    }
    
    <DataContract()>  _
    Public Class MathFault
        <DataMember()>  _
        Public operation As String
        <DataMember()>  _
        Public description As String
    End Class 
    
  3. Wenden Sie in der Schnittstelle, die den Fehler zurückgibt, das FaultContractAttribute-Attribut auf die Methode an, die den Fehler zurückgibt, und setzen Sie den detailType-Parameter auf den Typ der Fehlerklasse.In the interface that will return the fault, apply the FaultContractAttribute attribute to the method that will return the fault and set the detailType parameter to the type of the fault class.

  4. Setzen Sie ebenfalls im Konstruktor die ProtectionLevel-Eigenschaft auf EncryptAndSign. Dies wird im folgenden Code veranschaulicht.Also in the constructor, set the ProtectionLevel property to EncryptAndSign, as shown in the following code.

    public interface ICalculator
    {
        // Set the ProtectionLevel on a FaultContractAttribute.
        [OperationContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
        [FaultContract(
            typeof(MathFault),
            Action = @"http://localhost/Add",
            Name = "AddFault",
            Namespace = "http://contoso.com",
            ProtectionLevel = ProtectionLevel.EncryptAndSign)]
        double Add(double a, double b);
    }
    
    Public Interface ICalculator
        ' Set the ProtectionLevel on a FaultContractAttribute.
        <OperationContract(ProtectionLevel := ProtectionLevel.EncryptAndSign), _
         FaultContract(GetType(MathFault), ProtectionLevel := ProtectionLevel.EncryptAndSign)>  _
        Function Add(ByVal a As Double, ByVal b As Double) As Double 
    End Interface 
    

Schützen von NachrichtenteilenProtecting Message Parts

Verwenden Sie einen Nachrichtenvertrag, um Teile einer Nachricht zu schützen.Use a message contract to protect parts of a message. Weitere Informationen zu Nachrichtenverträgen finden Sie unter Verwendung von Nachrichtenverträgen.For more information about message contracts, see Using Message Contracts.

So schützen Sie einen NachrichtentextTo protect a message body

  1. Erstellen Sie einen Typ, der die Nachricht darstellt.Create a type that represents the message. Das folgende Beispiel erstellt eine Company-Klasse mit zwei Feldern, CompanyName und CompanyID.The following example creates a Company class with two fields, CompanyName and CompanyID.

  2. Wenden Sie das MessageContractAttribute-Attribut auf die Klasse an, und setzen Sie die ProtectionLevel-Eigenschaft auf EncryptAndSign.Apply the MessageContractAttribute attribute to the class and set the ProtectionLevel property to EncryptAndSign.

  3. Wenden Sie das MessageHeaderAttribute-Attribut auf ein Feld an, das als Nachrichtenheader ausgedrückt wird, und setzen Sie die ProtectionLevel-Eigenschaft auf EncryptAndSign.Apply the MessageHeaderAttribute attribute to a field that will be expressed as a message header and set the ProtectionLevel property to EncryptAndSign.

  4. Anwenden der MessageBodyMemberAttribute auf jedes Feld, das als Teil des Nachrichtentexts ausgedrückt, und legen Sie die ProtectionLevel Eigenschaft EncryptAndSign, wie im folgenden Beispiel gezeigt.Apply the MessageBodyMemberAttribute to any field that will be expressed as part of the message body, and set the ProtectionLevel property to EncryptAndSign, as shown in the following example.

    [MessageContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
    public class Company
    {
        [MessageHeader(ProtectionLevel = ProtectionLevel.Sign)]
        public string CompanyName;
    
        [MessageBodyMember(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
        public string CompanyID;
    }
    
    <MessageContract(ProtectionLevel := ProtectionLevel.EncryptAndSign)>  _
    Public Class Company
        <MessageHeader(ProtectionLevel := ProtectionLevel.Sign)>  _
        Public CompanyName As String
        
        <MessageBodyMember(ProtectionLevel := ProtectionLevel.EncryptAndSign)>  _
        Public CompanyID As String
    End Class 
    

BeispielExample

Im folgenden Beispiel wird die ProtectionLevel-Eigenschaft mehrerer Attributklassen an verschiedenen Stellen in einem Dienst festgelegt.The following example sets the ProtectionLevel property of several attribute classes at various places in a service.

[ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public interface ICalculator
{
    [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
    double Add(double a, double b);


    [OperationContract()]
    [FaultContract(typeof(MathFault),
        ProtectionLevel = ProtectionLevel.EncryptAndSign)]
    double Subtract(double a, double b);

    [OperationContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
    Company GetCompanyInfo();
}


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

[MessageContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
public class Company
{
    [MessageHeader(ProtectionLevel = ProtectionLevel.Sign)]
    public string CompanyName;

    [MessageBodyMember(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
    public string CompanyID;
}

[MessageContract(ProtectionLevel = ProtectionLevel.Sign)]
public class Calculator : ICalculator
{
    public double Add(double a, double b)
    {
        return a + b;
    }


    public double Subtract(double a, double b)
    {
        return a - b;
    }

    public Company GetCompanyInfo()
    {
        Company co = new Company();
        co.CompanyName = "www.cohowinery.com";
        return co;
    }

}

public class Test
{
    static void Main()
    {
        Test t = new Test();
        try
        {
            t.Run();
        }
        catch (System.InvalidOperationException inv)
        {
            Console.WriteLine(inv.Message);
        }
    }

    private void Run()
    {
        // Create a binding and set the security mode to Message.
        WSHttpBinding b = new WSHttpBinding();
        b.Security.Mode = SecurityMode.Message;

        Type contractType = typeof(ICalculator);
        Type implementedContract = typeof(Calculator);
        Uri baseAddress = new Uri("http://localhost:8044/base");

        // Create the ServiceHost and add an endpoint.
        ServiceHost sh = new ServiceHost(implementedContract, baseAddress);
        sh.AddServiceEndpoint(contractType, b, "Calculator");

        ServiceMetadataBehavior sm = new ServiceMetadataBehavior();
        sm.HttpGetEnabled = true;
        sh.Description.Behaviors.Add(sm);
        sh.Credentials.ServiceCertificate.SetCertificate(
            StoreLocation.CurrentUser,
            StoreName.My,
            X509FindType.FindByIssuerName,
            "ValidCertificateIssuer");

        foreach (ServiceEndpoint se in sh.Description.Endpoints)
        {
            ContractDescription cd = se.Contract;
            Console.WriteLine("\nContractDescription: ProtectionLevel = {0}", cd.Name, cd.ProtectionLevel);
            foreach (OperationDescription od in cd.Operations)
            {
                Console.WriteLine("\nOperationDescription: Name = {0}", od.Name, od.ProtectionLevel);
                Console.WriteLine("ProtectionLevel = {1}", od.Name, od.ProtectionLevel);
                foreach (MessageDescription m in od.Messages)
                {
                    Console.WriteLine("\t {0}: {1}", m.Action, m.ProtectionLevel);
                    foreach (MessageHeaderDescription mh in m.Headers)
                    {
                        Console.WriteLine("\t\t {0}: {1}", mh.Name, mh.ProtectionLevel);

                        foreach (MessagePropertyDescription mp in m.Properties)
                        {
                            Console.WriteLine("{0}: {1}", mp.Name, mp.ProtectionLevel);
                        }
                    }
                }
            }
        }
        sh.Open();
        Console.WriteLine("Listening");
        Console.ReadLine();
        sh.Close();

    }
}
<ServiceContract(ProtectionLevel := ProtectionLevel.EncryptAndSign)>  _
Public Interface ICalculator
    <OperationContract(ProtectionLevel := ProtectionLevel.EncryptAndSign)>  _
    Function Add(ByVal a As Double, ByVal b As Double) As Double 
    
    
    <OperationContract(), _
       FaultContract _
       (GetType(MathFault), _
       Action := "http://localhost/Add", _
       Name := "AddFault", _
       Namespace :="http://contoso.com", _
       ProtectionLevel := ProtectionLevel.EncryptAndSign)>  _
    Function Subtract(ByVal a As Double, ByVal b As Double) As Double 
    
    <OperationContract(ProtectionLevel := ProtectionLevel.EncryptAndSign)>  _
    Function GetCompanyInfo() As Company 
End Interface 


<DataContract()>  _
Public Class MathFault
    <DataMember()>  _
    Public operation As String
    <DataMember()>  _
    Public description As String
End Class 

<MessageContract(ProtectionLevel := ProtectionLevel.EncryptAndSign)>  _
Public Class Company
    <MessageHeader(ProtectionLevel := ProtectionLevel.Sign)>  _
    Public CompanyName As String
    
    <MessageBodyMember(ProtectionLevel := ProtectionLevel.EncryptAndSign)>  _
    Public CompanyID As String
End Class 

<MessageContract(ProtectionLevel := ProtectionLevel.Sign)>  _
Public Class Calculator
    Implements ICalculator
    
    Public Function Add(ByVal a As Double, ByVal b As Double) As Double _
      Implements ICalculator.Add
        Return a + b
    
    End Function 
    
    Public Function Subtract(ByVal a As Double, ByVal b As Double) As Double _
       Implements ICalculator.Subtract
        Return a - b
    
    End Function      
    
    Public Function GetCompanyInfo() As Company Implements ICalculator.GetCompanyInfo
        Dim co As New Company()
        co.CompanyName = "www.cohowinery.com"
        Return co
    End Function 
End Class 


Public Class Test
    
    Shared Sub Main() 
        Dim t As New Test()
        Try
            t.Run()
        Catch inv As System.InvalidOperationException
            Console.WriteLine(inv.Message)
        End Try
    End Sub 
    
    
    Private Sub Run() 
        ' Create a binding and set the security mode to Message.
        Dim b As New WSHttpBinding()
        b.Security.Mode = SecurityMode.Message
        
        Dim contractType As Type = GetType(ICalculator)
        Dim implementedContract As Type = GetType(Calculator)
        Dim baseAddress As New Uri("http://localhost:8044/base")
        
        ' Create the ServiceHost and add an endpoint.
        Dim sh As New ServiceHost(implementedContract, baseAddress)
        sh.AddServiceEndpoint(contractType, b, "Calculator")
        
        Dim sm As New ServiceMetadataBehavior()
        sm.HttpGetEnabled = True
        sh.Description.Behaviors.Add(sm)
        sh.Credentials.ServiceCertificate.SetCertificate( _
           StoreLocation.CurrentUser, StoreName.My, _
           X509FindType.FindByIssuerName, "ValidCertificateIssuer")
        
        Dim se As ServiceEndpoint
        For Each se In  sh.Description.Endpoints
            Dim cd As ContractDescription = se.Contract
            Console.WriteLine(vbLf + "ContractDescription: ProtectionLevel = {0}", _
               cd.Name, cd.ProtectionLevel)
            Dim od As OperationDescription
            For Each od In  cd.Operations
                Console.WriteLine(vbLf + "OperationDescription: Name = {0}", od.Name, od.ProtectionLevel)
                Console.WriteLine("ProtectionLevel = {1}", od.Name, od.ProtectionLevel)
                Dim m As MessageDescription
                For Each m In  od.Messages
                    Console.WriteLine(vbTab + " {0}: {1}", m.Action, m.ProtectionLevel)
                    Dim mh As MessageHeaderDescription
                    For Each mh In  m.Headers
                        Console.WriteLine(vbTab + vbTab + " {0}: {1}", mh.Name, mh.ProtectionLevel)
                        
                        Dim mp As MessagePropertyDescription
                        For Each mp In  m.Properties
                            Console.WriteLine("{0}: {1}", mp.Name, mp.ProtectionLevel)
                        Next mp
                    Next mh
                Next m
            Next od
        Next se
        sh.Open()
        Console.WriteLine("Listening")
        Console.ReadLine()
        sh.Close()
    
    End Sub 
End Class 

Kompilieren des CodesCompiling the Code

Der folgende Code zeigt die für die Kompilierung des Beispielcodes erforderlichen Namespaces.The following code shows the namespaces required to compile the example code.

using System;
using System.ServiceModel;
using System.Net.Security;
using System.ServiceModel.Description;
using System.Security.Permissions;
using System.Security.Cryptography.X509Certificates;
using System.Runtime.Serialization;
Imports System
Imports System.ServiceModel
Imports System.Net.Security
Imports System.ServiceModel.Description
Imports System.Security.Permissions
Imports System.Security.Cryptography.X509Certificates
Imports System.Runtime.Serialization

Siehe auchSee Also

ServiceContractAttribute
OperationContractAttribute
FaultContractAttribute
MessageContractAttribute
MessageBodyMemberAttribute
Grundlagen der SchutzebeneUnderstanding Protection Level