Określanie zachowania środowiska uruchomieniowego usługi
Po zaprojektowaniu kontraktu usługi (projektowanie kontraktów usług) i zaimplementowaniu kontraktu usługi (Implementowanie kontraktów usług) można skonfigurować działanie środowiska uruchomieniowego usługi. W tym temacie omówiono zachowania usług i operacji zapewnianych przez system oraz opisano, gdzie znaleźć więcej informacji na temat tworzenia nowych zachowań. Podczas gdy niektóre zachowania są stosowane jako atrybuty, wiele z nich jest stosowana przy użyciu pliku konfiguracji aplikacji lub programowo. Aby uzyskać więcej informacji na temat konfigurowania aplikacji usługi, zobacz Konfigurowanie usług.
Omówienie
Kontrakt definiuje dane wejściowe, dane wyjściowe, typy danych i możliwości usługi tego typu. Implementowanie kontraktu usługi tworzy klasę, która po skonfigurowaniu przy użyciu powiązania na adresie spełnia kontrakt, który implementuje. Informacje o umowie, powiązaniu i adresie są znane przez klienta; bez nich klient nie może korzystać z usługi.
Jednak specyficzne dla operacji, takie jak problemy z wątkami lub zarządzanie wystąpieniami, są nieprzezroczyste dla klientów. Po zaimplementowaniu kontraktu usługi można skonfigurować dużą liczbę cech operacji przy użyciu zachowań. Zachowania to obiekty modyfikujące środowisko uruchomieniowe programu Windows Communication Foundation (WCF), ustawiając właściwość środowiska uruchomieniowego lub wstawiając typ dostosowywania do środowiska uruchomieniowego. Aby uzyskać więcej informacji na temat modyfikowania środowiska uruchomieniowego przez tworzenie zachowań zdefiniowanych przez użytkownika, zobacz Rozszerzanie elementu ServiceHost i warstwy modelu usługi.
Atrybuty System.ServiceModel.ServiceBehaviorAttribute i System.ServiceModel.OperationBehaviorAttribute są najczęściej przydatnymi zachowaniami i uwidaczniają najczęściej żądane funkcje operacji. Ponieważ są to atrybuty, należy je zastosować do implementacji usługi lub operacji. Inne zachowania, takie jak System.ServiceModel.Description.ServiceMetadataBehavior lub System.ServiceModel.Description.ServiceDebugBehavior, są zwykle stosowane przy użyciu pliku konfiguracji aplikacji, chociaż można ich używać programowo.
W tym temacie omówiono ServiceBehaviorAttribute atrybuty i OperationBehaviorAttribute , opisano różne zakresy, w których mogą działać zachowania, oraz krótki opis wielu zachowań udostępnianych przez system w różnych zakresach, które mogą być interesujące dla deweloperów programu WCF.
ServiceBehaviorAttribute i OperationBehaviorAttribute
Najważniejsze zachowania to ServiceBehaviorAttribute atrybuty i OperationBehaviorAttribute , których można użyć do kontrolowania:
Okresy istnienia wystąpień
Obsługa współbieżności i synchronizacji
Zachowanie konfiguracji
Zachowanie transakcji
Zachowanie serializacji
Przekształcanie metadanych
Okres istnienia sesji
Filtrowanie adresów i przetwarzanie nagłówków
Personifikacja
Aby użyć tych atrybutów, oznacz implementację usługi lub operacji za pomocą atrybutu odpowiedniego dla tego zakresu i ustaw właściwości. Na przykład poniższy przykład kodu przedstawia implementację operacji, która używa OperationBehaviorAttribute.Impersonation właściwości , aby wymagać personifikacji wywołań tej operacji.
using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading;
namespace Microsoft.WCF.Documentation
{
[ServiceContract(
Name="SampleHello",
Namespace="http://microsoft.wcf.documentation"
)]
public interface IHello
{
[OperationContract]
string Hello(string greeting);
}
public class HelloService : IHello
{
public HelloService()
{
Console.WriteLine("Service object created: " + this.GetHashCode().ToString());
}
~HelloService()
{
Console.WriteLine("Service object destroyed: " + this.GetHashCode().ToString());
}
[OperationBehavior(Impersonation=ImpersonationOption.Required)]
public string Hello(string greeting)
{
Console.WriteLine("Called by: " + Thread.CurrentPrincipal.Identity.Name);
Console.WriteLine("IsAuthenticated: " + Thread.CurrentPrincipal.Identity.IsAuthenticated.ToString());
Console.WriteLine("AuthenticationType: " + Thread.CurrentPrincipal.Identity.AuthenticationType.ToString());
Console.WriteLine("Caller sent: " + greeting);
Console.WriteLine("Sending back: Hi, " + Thread.CurrentPrincipal.Identity.Name);
return "Hi, " + Thread.CurrentPrincipal.Identity.Name;
}
}
}
Imports System.ServiceModel
Imports System.Threading
Namespace Microsoft.WCF.Documentation
<ServiceContract(Name:="SampleHello", Namespace:="http://microsoft.wcf.documentation")> _
Public Interface IHello
<OperationContract> _
Function Hello(ByVal greeting As String) As String
End Interface
Public Class HelloService
Implements IHello
Public Sub New()
Console.WriteLine("Service object created: " & Me.GetHashCode().ToString())
End Sub
Protected Overrides Sub Finalize()
Console.WriteLine("Service object destroyed: " & Me.GetHashCode().ToString())
End Sub
<OperationBehavior(Impersonation:=ImpersonationOption.Required)> _
Public Function Hello(ByVal greeting As String) As String Implements IHello.Hello
Console.WriteLine("Called by: " & Thread.CurrentPrincipal.Identity.Name)
Console.WriteLine("IsAuthenticated: " & Thread.CurrentPrincipal.Identity.IsAuthenticated.ToString())
Console.WriteLine("AuthenticationType: " & Thread.CurrentPrincipal.Identity.AuthenticationType.ToString())
Console.WriteLine("Caller sent: " & greeting)
Console.WriteLine("Sending back: Hi, " & Thread.CurrentPrincipal.Identity.Name)
Return "Hi, " & Thread.CurrentPrincipal.Identity.Name
End Function
End Class
End Namespace
Wiele właściwości wymaga dodatkowej obsługi powiązania. Na przykład operacja, która wymaga transakcji od klienta, musi być skonfigurowana tak, aby korzystała z powiązania obsługującego przepływane transakcje.
Dobrze znane usługi singleton
Można użyć ServiceBehaviorAttribute atrybutów i OperationBehaviorAttribute do kontrolowania określonych okresów istnienia, zarówno InstanceContext obiektów usługi, jak i, które implementują operacje.
Na przykład właściwość określa, ServiceBehaviorAttribute.InstanceContextMode jak często InstanceContext jest zwalniana, oraz kontrolkę OperationBehaviorAttribute.ReleaseInstanceMode właściwości i ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete po wydaniu obiektu usługi.
Można jednak samodzielnie utworzyć obiekt usługi i utworzyć hosta usługi przy użyciu tego obiektu. W tym celu należy również ustawić ServiceBehaviorAttribute.InstanceContextMode właściwość na Single lub zgłaszany jest wyjątek po otwarciu hosta usługi.
Użyj konstruktora ServiceHost(Object, Uri[]) , aby utworzyć taką usługę. Stanowi alternatywę dla implementacji niestandardowej System.ServiceModel.Dispatcher.IInstanceContextInitializer , gdy chcesz udostępnić określone wystąpienie obiektu do użycia przez pojedynczą usługę. Tego przeciążenia można użyć, gdy typ implementacji usługi jest trudny do skonstruowania (na przykład jeśli nie implementuje bez parametrów publicznego konstruktora).
Należy pamiętać, że gdy obiekt jest dostarczany do tego konstruktora, niektóre funkcje związane z zachowaniem instancingu programu Windows Communication Foundation (WCF) działają inaczej. Na przykład wywołanie InstanceContext.ReleaseServiceInstance nie ma wpływu, gdy podano dobrze znane wystąpienie obiektu. Podobnie każdy inny mechanizm wydawania wystąpień jest ignorowany. Klasa ServiceHost zawsze zachowuje się tak, jakby OperationBehaviorAttribute.ReleaseInstanceMode właściwość jest ustawiona ReleaseInstanceMode.None dla wszystkich operacji.
Inne zachowania usługi, punktu końcowego, kontraktu i operacji
Zachowania usługi, takie jak ServiceBehaviorAttribute atrybut, działają w całej usłudze. Jeśli na przykład ustawisz ServiceBehaviorAttribute.ConcurrencyMode właściwość na wartość , musisz samodzielnie obsługiwać ConcurrencyMode.Multiple problemy z synchronizacją wątków wewnątrz każdej operacji w tej usłudze. Zachowania punktów końcowych działają w obrębie punktu końcowego; wiele zachowań punktów końcowych udostępnianych przez system jest przeznaczonych dla funkcji klienta. Zachowania kontraktu działają na poziomie kontraktu, a zachowania operacji modyfikują dostarczanie operacji.
Wiele z tych zachowań jest implementowanych na atrybutach i używa się ServiceBehaviorAttribute ich w miarę wykonywania atrybutów i OperationBehaviorAttribute — stosując je do odpowiedniej klasy usługi lub implementacji operacji. Inne zachowania, takie jak ServiceMetadataBehavior obiekty lub ServiceDebugBehavior , są zwykle stosowane przy użyciu pliku konfiguracji aplikacji, chociaż mogą być również używane programowo.
Na przykład publikacja metadanych jest konfigurowana przy użyciu ServiceMetadataBehavior obiektu . Poniższy plik konfiguracji aplikacji przedstawia najbardziej typowe użycie.
<configuration>
<system.serviceModel>
<services>
<service
name="Microsoft.WCF.Documentation.SampleService"
behaviorConfiguration="metadataSupport"
>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/SampleService" />
</baseAddresses>
</host>
<endpoint
address=""
binding="wsHttpBinding"
contract="Microsoft.WCF.Documentation.ISampleService"
/>
<!-- Adds a WS-MetadataExchange endpoint at -->
<!-- "http://localhost:8080/SampleService/mex" -->
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="metadataSupport">
<!-- Enables the IMetadataExchange endpoint in services that -->
<!-- use "metadataSupport" in their behaviorConfiguration attribute. -->
<!-- In addition, the httpGetEnabled and httpGetUrl attributes publish -->
<!-- Service metadata for retrieval by HTTP/GET at the address -->
<!-- "http://localhost:8080/SampleService?wsdl" -->
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
W poniższych sekcjach opisano wiele z najbardziej przydatnych zachowań udostępnianych przez system, których można użyć do modyfikowania dostarczania środowiska uruchomieniowego usługi lub klienta. Zapoznaj się z tematem referencyjnym, aby określić, jak używać każdego z nich.
Zachowania usługi
Następujące zachowania działają na usługach.
AspNetCompatibilityRequirementsAttribute. Zastosowano do usługi WCF, aby wskazać, czy można uruchomić usługę w trybie zgodności ASP.NET.
ServiceAuthorizationBehavior. Określa sposób autoryzacji oświadczeń klientów przez usługę.
ServiceCredentials. Konfiguruje poświadczenia usługi. Użyj tej klasy, aby określić poświadczenia dla usługi, takie jak certyfikat X.509.
ServiceDebugBehavior. Umożliwia debugowanie i funkcje informacji pomocy dla usługi WCF.
ServiceMetadataBehavior. Steruje publikacją metadanych usługi i skojarzonymi informacjami.
ServiceSecurityAuditBehavior. Określa zachowanie inspekcji zdarzeń zabezpieczeń.
ServiceThrottlingBehavior. Konfiguruje ustawienia przepływności czasu wykonywania, które umożliwiają dostosowywanie wydajności usługi.
Zachowania punktów końcowych
Następujące zachowania działają w punktach końcowych. Wiele z tych zachowań jest używanych w aplikacjach klienckich.
CallbackBehaviorAttribute. Konfiguruje implementację usługi wywołania zwrotnego w aplikacji klienckiej dwukierunkowej.
CallbackDebugBehavior. Włącza debugowanie usługi dla obiektu wywołania zwrotnego WCF.
ClientCredentials. Umożliwia użytkownikowi skonfigurowanie poświadczeń klienta i usługi oraz ustawień uwierzytelniania poświadczeń usługi do użycia na kliencie.
ClientViaBehavior. Używany przez klientów do określania identyfikatora URI ( Uniform Resource Identifier), dla którego ma zostać utworzony kanał transportu.
MustUnderstandBehavior. Nakazuje programowi WCF wyłączenie przetwarzania
MustUnderstand
.SynchronousReceiveBehavior. Instruuje środowisko uruchomieniowe, aby używało synchronicznego procesu odbierania dla kanałów.
TransactedBatchingBehavior. Optymalizuje operacje odbierania dla transportu, które obsługują odbieranie transakcyjne.
Zachowania kontraktu
DeliveryRequirementsAttribute. Określa wymagania dotyczące funkcji, które powiązania muszą dostarczyć do usługi lub implementacji klienta.
Zachowania operacji
Następujące zachowania operacji określają serializacji i kontrolek transakcji dla operacji.
DataContractSerializerOperationBehavior. Reprezentuje zachowanie w czasie wykonywania elementu System.Runtime.Serialization.DataContractSerializer.
XmlSerializerOperationBehavior. Steruje zachowaniem środowiska uruchomieniowego obiektu
XmlSerializer
i kojarzy je z operacją.TransactionFlowAttribute. Określa poziom, na którym operacja usługi akceptuje nagłówek transakcji.