Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Úroveň ochrany můžete nastavit použitím příslušného atributu a nastavením vlastnosti. Ochranu můžete nastavit na úrovni služby tak, aby ovlivnila všechny části každé zprávy, nebo můžete nastavit ochranu na stále podrobnějších úrovních od metod po části zpráv. Další informace o vlastnosti ProtectionLevel naleznete v tématu Pochopení úrovně ochrany.
Poznámka:
Úrovně ochrany můžete nastavit pouze v kódu, ne v konfiguraci.
Podepsání všech zpráv pro službu
Vytvořte rozhraní pro službu.
Použijte atribut ServiceContractAttribute na službu a nastavte vlastnost ProtectionLevel na Sign, jak je znázorněno v následujícím kódu (výchozí úroveň je 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
Podepsání všech částí zprávy pro operaci
Vytvořte rozhraní pro službu a použijte atribut ServiceContractAttribute na rozhraní.
Přidejte do rozhraní deklaraci metody.
Použijte atribut OperationContractAttribute pro metodu a nastavte vlastnost ProtectionLevel na Sign, jak je znázorněno v následujícím kódu.
// 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
Ochrana chybových zpráv
Výjimky, které jsou vyvolány v rámci služby, je možné odeslat klientovi jako chyby SOAP. Další informace o vytváření chyb silného typu naleznete v tématu Určení a zpracování chyb v kontraktech a službách a Postupy: Deklarace chyb v kontraktech služeb.
Chránit chybovou zprávu
Vytvořte typ, který představuje zprávu o chybě. Následující příklad vytvoří třídu s názvem
MathFaultse dvěma poli.Použijte atribut DataContractAttribute na typ a atribut DataMemberAttribute na každé pole, které by mělo být serializováno, jak je znázorněno v následujícím kódu.
[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 ClassV rozhraní, které vrátí chybu, použijte atribut FaultContractAttribute na metodu, která vrátí chybu a nastaví parametr
detailTypena typ třídy selhání.Také v konstruktoru nastavte ProtectionLevel vlastnost na EncryptAndSign, jak je znázorněno v následujícím kódu.
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
Ochrana částí zpráv
K ochraně částí zprávy použijte kontrakt zprávy. Další informace o kontraktech zpráv naleznete v tématu Použití kontraktů zpráv.
K ochraně textu zprávy
Vytvořte typ, který představuje zprávu. Následující příklad vytvoří třídu
Companyse dvěma poli,CompanyNameaCompanyID.Aplikujte atribut MessageContractAttribute na třídu a nastavte vlastnost ProtectionLevel na EncryptAndSign.
Použití atributu MessageHeaderAttribute u pole, které bude vyjádřeno jako záhlaví zprávy, a nastavte vlastnost
ProtectionLevelna EncryptAndSign.Použijte MessageBodyMemberAttribute u libovolného pole, které bude vyjádřeno jako součást textu zprávy, a nastavte vlastnost
ProtectionLevelna EncryptAndSign, jak je znázorněno v následujícím příkladu.[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
Příklad
Následující příklad nastaví vlastnost ProtectionLevel několika tříd atributů v různých částech služby.
[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 = {cd.Name}");
foreach (OperationDescription od in cd.Operations)
{
Console.WriteLine($"\nOperationDescription: Name = {od.Name}");
Console.WriteLine($"ProtectionLevel = {od.ProtectionLevel}");
foreach (MessageDescription m in od.Messages)
{
Console.WriteLine($"\t {m.Action}: {m.ProtectionLevel}");
foreach (MessageHeaderDescription mh in m.Headers)
{
Console.WriteLine($"\t\t {mh.Name}: {mh.ProtectionLevel}");
foreach (MessagePropertyDescription mp in m.Properties)
{
Console.WriteLine($"{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
Kompilace kódu
Následující kód ukazuje obory názvů potřebné ke kompilaci ukázkového kódu.
using System;
using System.ServiceModel;
using System.Net.Security;
using System.ServiceModel.Description;
using System.Security.Cryptography.X509Certificates;
using System.Runtime.Serialization;
Imports System.ServiceModel
Imports System.Net.Security
Imports System.ServiceModel.Description
Imports System.Security.Cryptography.X509Certificates
Imports System.Runtime.Serialization