Tworzenie wiązań zdefiniowanych przez użytkownika

Istnieje kilka sposobów tworzenia powiązań, które nie są dostarczane przez system:

  • Utwórz powiązanie niestandardowe na CustomBinding podstawie klasy, czyli kontenera wypełnianego elementami powiązania. Powiązanie niestandardowe jest następnie dodawane do punktu końcowego usługi. Powiązanie niestandardowe można utworzyć programowo lub w pliku konfiguracji aplikacji. Aby użyć elementu powiązania z pliku konfiguracji aplikacji, element powiązania musi rozszerzyć element BindingElementExtensionElement. Aby uzyskać więcej informacji na temat powiązań niestandardowych, zobacz Powiązania niestandardowe i CustomBinding.

  • Możesz utworzyć klasę, która pochodzi z powiązania standardowego. Na przykład można utworzyć klasę z WSHttpBinding metody i zastąpić CreateBindingElements ją, aby uzyskać elementy powiązania i wstawić niestandardowy element powiązania lub ustanowić określoną wartość dla zabezpieczeń.

  • Możesz utworzyć nowy Binding typ, aby całkowicie kontrolować całą implementację powiązania.

Kolejność elementów powiązania

Każdy element powiązania reprezentuje krok przetwarzania podczas wysyłania lub odbierania komunikatów. W czasie wykonywania elementy powiązania tworzą kanały i odbiorniki niezbędne do tworzenia stosów wychodzących i przychodzących kanałów.

Istnieją trzy główne typy elementów powiązania: Elementy powiązania protokołu, Elementy powiązania kodowania i Elementy powiązania transportu.

Elementy powiązania protokołu — te elementy reprezentują kroki przetwarzania wyższego poziomu, które działają na komunikatach. Kanały i odbiorniki utworzone przez te elementy powiązania mogą dodawać, usuwać lub modyfikować zawartość wiadomości. Dane powiązanie może mieć dowolną liczbę elementów powiązania protokołu, z których każdy dziedziczy z BindingElementelementu . Program Windows Communication Foundation (WCF) zawiera kilka elementów powiązania protokołu, w tym i ReliableSessionBindingElementSymmetricSecurityBindingElement.

Kodowanie binding, element — te elementy reprezentują przekształcenia między komunikatem a kodowaniem gotowym do transmisji na przewodach. Typowe powiązania WCF zawierają dokładnie jeden element powiązania kodowania. Przykłady elementów powiązania kodowania obejmują MtomMessageEncodingBindingElementelementy , BinaryMessageEncodingBindingElement, i TextMessageEncodingBindingElement. Jeśli dla powiązania nie określono elementu powiązania kodowania, zostanie użyte domyślne kodowanie. Wartość domyślna to tekst, gdy transport to HTTP i binarne.

Transport Binding, element — te elementy reprezentują transmisję komunikatu kodowania w protokole transportowym. Typowe powiązania WCF obejmują dokładnie jeden element powiązania transportu, który dziedziczy z TransportBindingElementklasy . Przykłady elementów powiązania transportu obejmują element TcpTransportBindingElement, HttpTransportBindingElement, i NamedPipeTransportBindingElement.

Podczas tworzenia nowych powiązań kolejność dodanych elementów powiązania jest ważna. Zawsze dodaj elementy powiązania w następującej kolejności:

Warstwa Opcje Wymagania
Przepływ transakcji System.ServiceModel.Channels.TransactionFlowBindingElement Nie.
Niezawodność System.ServiceModel.Channels.ReliableSessionBindingElement Nie.
Zabezpieczenia System.ServiceModel.Channels.SecurityBindingElement Nie.
Dupleks złożony System.ServiceModel.Channels.CompositeDuplexBindingElement Nie.
Kodowanie Tekst, binarny, MTOM, niestandardowy Tak*
Transport TCP, nazwane potoki, HTTP, HTTPS, MSMQ, niestandardowe Tak

*Ponieważ kodowanie jest wymagane dla każdego powiązania, jeśli nie określono kodowania, program WCF dodaje domyślne kodowanie. Wartość domyślna to Text/XML dla transportów HTTP i HTTPS, a w przeciwnym razie plik binarny.

Tworzenie nowego elementu powiązania

Oprócz typów pochodzących z BindingElement tych, które są dostarczane przez usługę WCF, można utworzyć własne elementy powiązania. Dzięki temu można dostosować sposób tworzenia stosu powiązań i składników, które są w nim przekazywane, tworząc własne BindingElement , które mogą składać się z innych typów dostarczanych przez system w stosie.

Jeśli na przykład zaimplementujesz element LoggingBindingElement zapewniający możliwość rejestrowania komunikatu w bazie danych, musisz umieścić go nad kanałem transportu w stosie kanału. W tym przypadku aplikacja tworzy powiązanie niestandardowe, które składa się LoggingBindingElement z TcpTransportBindingElementelementu , jak w poniższym przykładzie.

Binding customBinding = new CustomBinding(  
  new LoggingBindingElement(),
  new TcpTransportBindingElement()  
);  

Sposób pisania nowego elementu powiązania zależy od jego dokładnej funkcjonalności. Jeden z przykładów: Transport: UDP zawiera szczegółowy opis sposobu implementowania jednego rodzaju elementu powiązania.

Tworzenie nowego powiązania

Element powiązania utworzony przez użytkownika może być używany na dwa sposoby. W poprzedniej sekcji przedstawiono pierwszy sposób: za pośrednictwem powiązania niestandardowego. Powiązanie niestandardowe umożliwia użytkownikowi utworzenie własnego powiązania na podstawie dowolnego zestawu elementów powiązania, w tym utworzonych przez użytkownika.

Jeśli używasz powiązania w więcej niż jednej aplikacji, utwórz własne powiązanie i rozszerz element Binding. Pozwala to uniknąć ręcznego tworzenia powiązania niestandardowego za każdym razem, gdy chcesz go używać. Powiązanie zdefiniowane przez użytkownika umożliwia zdefiniowanie zachowania powiązania i dołączenie elementów powiązania zdefiniowanych przez użytkownika. I jest wstępnie spakowany: nie trzeba kompilować powiązania za każdym razem, gdy go używasz.

Co najmniej powiązanie zdefiniowane przez użytkownika musi implementować metodę CreateBindingElements i Scheme właściwość .

Metoda CreateBindingElements zwraca nowy BindingElementCollection element zawierający elementy powiązania dla powiązania. Kolekcja jest uporządkowana i powinna zawierać najpierw elementy powiązania protokołu, a następnie element powiązania kodowania, a następnie element powiązania transportu. W przypadku korzystania z elementów powiązania dostarczonego przez system WCF należy postępować zgodnie z regułami porządkowania elementów powiązania określonymi w powiązaniach niestandardowych. Ta kolekcja nigdy nie powinna odwoływać się do obiektów, do których odwołuje się klasa powiązania zdefiniowanego przez użytkownika; w związku z tym autorzy powiązań muszą zwrócić wartość Clone() dla BindingElementCollection każdego wywołania metody CreateBindingElements.

Właściwość Scheme reprezentuje schemat identyfikatora URI dla protokołu transportowego używanego w powiązaniu. Na przykład WSHttpBinding i NetTcpBinding zwracają wartości "http" i "net.tcp" z odpowiednich Scheme właściwości.

Aby uzyskać pełną listę opcjonalnych metod i właściwości powiązań zdefiniowanych przez użytkownika, zobacz Binding.

Przykład

W tym przykładzie zaimplementowane jest powiązanie profilu w pliku SampleProfileUdpBinding, które pochodzi z elementu Binding. Element SampleProfileUdpBinding zawiera maksymalnie cztery elementy powiązania w nim: jeden utworzony przez UdpTransportBindingElementużytkownika ; i trzy dostarczane przez system: TextMessageEncodingBindingElement, CompositeDuplexBindingElementi ReliableSessionBindingElement.

public override BindingElementCollection CreateBindingElements()  
{
    BindingElementCollection bindingElements = new BindingElementCollection();  
    if (ReliableSessionEnabled)  
    {  
        bindingElements.Add(session);  
        bindingElements.Add(compositeDuplex);  
    }  
    bindingElements.Add(encoding);  
    bindingElements.Add(transport);  
    return bindingElements.Clone();  
}  

Ograniczenia zabezpieczeń z kontraktami dwukierunkowymi

Nie wszystkie elementy powiązania są ze sobą zgodne. W szczególności istnieją pewne ograniczenia dotyczące elementów powiązania zabezpieczeń, gdy są używane z kontraktami dwudupleksowymi.

Zabezpieczenia jednorazowe

Zabezpieczenia typu "jeden strzał" można zaimplementować, gdy wszystkie niezbędne poświadczenia zabezpieczeń są wysyłane w jednym komunikacie, ustawiając negotiateServiceCredential atrybut elementu konfiguracji komunikatu <> na falsewartość .

Uwierzytelnianie jednorazowe nie działa z kontraktami dwudupleksowymi.

W przypadku kontraktów request-reply uwierzytelnianie jednostrzelone działa tylko wtedy, gdy stos powiązań poniżej elementu powiązania zabezpieczeń obsługuje tworzenie IRequestChannel lub IRequestSessionChannel wystąpienia.

W przypadku kontraktów jednokierunkowych uwierzytelnianie jednokierunkowe działa, jeśli stos powiązań poniżej elementu powiązania zabezpieczeń obsługuje tworzenie IRequestChannelwystąpień , IRequestSessionChannellub IOutputChannelIOutputSessionChannel .

Tokeny kontekstu zabezpieczeń trybu plików cookie nie mogą być używane z kontraktami dwukierunkowymi.

W przypadku kontraktów żądań i odpowiedzi tokeny kontekstu zabezpieczeń trybu cookie działają tylko wtedy, gdy stos powiązań poniżej elementu powiązania zabezpieczeń obsługuje tworzenie IRequestChannel lub IRequestSessionChannel wystąpienia.

W przypadku kontraktów jednokierunkowych tokeny kontekstu zabezpieczeń trybu plików cookie działają, jeśli stos powiązania poniżej elementu powiązania zabezpieczeń obsługuje tworzenie IRequestChannel wystąpień lub IRequestSessionChannel ich wystąpienia.

Tokeny kontekstu zabezpieczeń trybu sesji

Tryb sesji SCT działa w przypadku kontraktów dwukierunkowych, jeśli stos powiązań poniżej elementu powiązania zabezpieczeń obsługuje tworzenie IDuplexChannel lub IDuplexSessionChannel wystąpienia.

Tryb sesji SCT działa w przypadku kontraktów żądań i odpowiedzi, jeśli stos powiązania poniżej elementu powiązania zabezpieczeń obsługuje tworzenie IDuplexChannelwystąpień , IDuplexSessionChannelIRequestChannel lub IRequestSessionChannel.

Tryb sesji SCT działa w przypadku kontraktów 1-way, jeśli stos powiązań poniżej elementu powiązania zabezpieczeń obsługuje tworzenie IDuplexChannelwystąpień , IDuplexSessionChannellub IRequestChannelIRequestSessionChannel .

Wyprowadzanie ze standardowego powiązania

Zamiast tworzyć zupełnie nową klasę powiązania, może być możliwe rozszerzenie jednego z istniejących powiązań dostarczonych przez system. Podobnie jak w poprzednim przypadku, należy zastąpić metodę CreateBindingElements i Scheme właściwość .

Zobacz też