Sdílet prostřednictvím


Vytváření uživatelem definovaných vazeb

Existuje několik způsobů, jak vytvořit vazby, které systém neposkytuje:

  • Vytvořte vlastní vazbu založenou CustomBinding na třídě, což je kontejner, který vyplníte prvky vazby. Vlastní vazba se pak přidá do koncového bodu služby. Vlastní vazbu můžete vytvořit buď prostřednictvím kódu programu, nebo v konfiguračním souboru aplikace. Chcete-li použít element vazby z konfiguračního souboru aplikace, musí element vazby rozšířit BindingElementExtensionElement. Další informace o vlastních vazbách naleznete v tématu Vlastní vazby a CustomBinding.

  • Můžete vytvořit třídu, která je odvozena ze standardní vazby. Můžete například odvodit třídu z WSHttpBinding metody přepsání CreateBindingElements získat prvky vazby a vložit vlastní binding element nebo vytvořit konkrétní hodnotu pro zabezpečení.

  • Můžete vytvořit nový Binding typ, který zcela řídí celou implementaci vazby.

Pořadí vazeb prvků

Každý prvek vazby představuje krok zpracování při odesílání nebo přijímání zpráv. V době běhu vytvářejí prvky vazby kanály a naslouchací procesy potřebné k sestavení zásobníků odchozích a příchozích kanálů.

Existují tři hlavní typy prvků vazby: Elementy vazby protokolu, Prvky vazby kódování a Transport Binding Elements.

Elementy vazby protokolu – tyto prvky představují kroky zpracování na vyšší úrovni, které fungují na zprávách. Kanály a naslouchací procesy vytvořené těmito prvky vazby mohou přidávat, odebírat nebo upravovat obsah zprávy. Daná vazba může mít libovolný počet elementů vazby protokolu, z nichž každý dědí .BindingElement Windows Communication Foundation (WCF) obsahuje několik prvků vazby protokolu, včetně a ReliableSessionBindingElementSymmetricSecurityBindingElement.

Element vazbu kódování – tyto prvky představují transformace mezi zprávou a kódováním připraveným k přenosu na drátu. Typické vazby WCF zahrnují přesně jeden element vazby kódování. Mezi příklady kódování vazeb patří MtomMessageEncodingBindingElement, BinaryMessageEncodingBindingElementa TextMessageEncodingBindingElement. Pokud pro vazbu není zadán element vazby kódování, použije se výchozí kódování. Výchozí hodnota je text, pokud je přenos HTTP a binární jinak.

Transport Binding Element – tyto prvky představují přenos zprávy kódování v přenosovém protokolu. Typické vazby WCF zahrnují přesně jeden prvek vazby přenosu, který dědí z TransportBindingElement. Mezi příklady transportních vazeb patří TcpTransportBindingElementprvky , , HttpTransportBindingElement, a NamedPipeTransportBindingElement.

Při vytváření nových vazeb je důležité pořadí přidaných prvků vazby. Vždy přidejte prvky vazby v následujícím pořadí:

Vrstva Možnosti Požaduje se
Tok transakcí System.ServiceModel.Channels.TransactionFlowBindingElement No
Spolehlivost System.ServiceModel.Channels.ReliableSessionBindingElement No
Zabezpečení System.ServiceModel.Channels.SecurityBindingElement No
Složený duplexní System.ServiceModel.Channels.CompositeDuplexBindingElement No
Kódování Text, Binární, MTOM, Vlastní Ano*
Přeprava TCP, pojmenované kanály, HTTP, HTTPS, MSMQ, vlastní Ano

*Vzhledem k tomu, že pro každou vazbu je vyžadováno kódování, přidá WCF za vás výchozí kódování. Výchozí hodnota je Text/XML pro přenosy HTTP a HTTPS a binární jinak.

Vytvoření nového elementu vazby

Kromě typů odvozených z BindingElement toho, které poskytuje WCF, můžete vytvořit vlastní vazbové prvky. To vám umožní přizpůsobit způsob vytvoření zásobníku vazeb a součástí, které v něm procházejí, vytvořením vlastního BindingElement typu, který se dá v zásobníku skládat s ostatními typy poskytovanými systémem.

Pokud například implementujete LoggingBindingElement možnost protokolovat zprávu do databáze, musíte ji umístit nad přenosový kanál do zásobníku kanálu. V tomto případě aplikace vytvoří vlastní vazbu, která se skládá LoggingBindingElement s TcpTransportBindingElement, jako v následujícím příkladu.

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

Způsob psaní nového elementu vazby závisí na jeho přesné funkčnosti. Jeden z ukázek, Transport: UDP, poskytuje podrobný popis, jak implementovat jeden druh vazby elementu.

Vytvoření nové vazby

Element vazby vytvořený uživatelem lze použít dvěma způsoby. Předchozí část ukazuje první způsob: prostřednictvím vlastní vazby. Vlastní vazba umožňuje uživateli vytvořit vlastní vazbu na základě libovolné sady vazeb prvků, včetně prvků vytvořených uživatelem.

Pokud používáte vazbu ve více než jedné aplikaci, vytvořte vlastní vazbu a rozšiřte Binding. Tím se zabrání ručnímu vytvoření vlastní vazby pokaždé, když ji chcete použít. Uživatelsky definovaná vazba umožňuje definovat chování vazby a zahrnout prvky vazby definované uživatelem. A je předem zabalený: při každém použití není nutné znovu sestavit vazbu.

Minimálně uživatelsky definovaná vazba musí implementovat metodu CreateBindingElementsScheme a vlastnost.

Metoda CreateBindingElements vrátí novou BindingElementCollection , která obsahuje prvky vazby pro vazbu. Kolekce je seřazena a měla by obsahovat nejprve elementy vazby protokolu následované elementem vazby kódování, následovaný elementem vazby přenosu. Pokud používáte elementy vazby poskytované systémem WCF, musíte postupovat podle pravidel řazení elementů vazby zadaných ve vlastních vazbách. Tato kolekce by nikdy neměla odkazovat na objekty odkazované v rámci uživatelem definované třídy vazby; v důsledku toho musí autoři vazby vracet Clone() při BindingElementCollection každém volání CreateBindingElements.

Vlastnost Scheme představuje schéma identifikátoru URI pro transportní protokol, který se používá u vazby. Například WSHttpBinding a NetTcpBinding vrací z příslušných Scheme vlastností "http" a "net.tcp".

Úplný seznam volitelných metod a vlastností pro uživatelsky definované vazby naleznete v tématu Binding.

Příklad

Tento příklad implementuje vazbu profilu, SampleProfileUdpBindingkterá je odvozena od Binding. Obsahuje SampleProfileUdpBinding až čtyři prvky vazby: jeden uživatel-vytvořen UdpTransportBindingElement; a tři systémem-poskytnuté: TextMessageEncodingBindingElement, CompositeDuplexBindingElementa 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();  
}  

Omezení zabezpečení s duplexní kontrakty

Ne všechny prvky vazby jsou vzájemně kompatibilní. Zejména existují určitá omezení prvků vazby zabezpečení při použití s duplexní kontrakty.

Zabezpečení jedním snímkem

Můžete implementovat "jednorázové" zabezpečení, kde se všechny nezbytné přihlašovací údaje zabezpečení posílají v jedné zprávě nastavením negotiateServiceCredential atributu <elementu konfigurace zprávy> na false.

Jednostřelové ověřování nefunguje s duplexní kontrakty.

U kontraktů Request-Reply funguje jednorázové ověřování pouze v případě, že zásobník vazeb pod elementem vazby zabezpečení podporuje vytváření IRequestChannel nebo IRequestSessionChannel instance.

U jednosměrných kontraktů funguje jednosměrné ověřování, pokud zásobník vazeb pod elementem vazby zabezpečení podporuje vytváření IRequestChannel, IRequestSessionChannelIOutputChannel nebo IOutputSessionChannel instance.

Tokeny kontextu režimu souborů cookie nelze použít s duplexní kontrakty.

Pro kontrakty Request-Reply fungují tokeny kontextu zabezpečení v režimu souborů cookie pouze v případě, že zásobník vazby pod elementem vazby zabezpečení podporuje vytváření IRequestChannel nebo IRequestSessionChannel instance.

U jednosměrných kontraktů funguje tokeny kontextu zabezpečení v režimu souborů cookie, pokud zásobník vazeb pod elementem vazby zabezpečení podporuje vytváření IRequestChannel nebo IRequestSessionChannel instance.

Tokeny kontextu zabezpečení v režimu relace

Režim relace SCT funguje pro duplexní kontrakty, pokud zásobník vazby pod elementem vazby zabezpečení podporuje vytváření IDuplexChannel nebo IDuplexSessionChannel instance.

Režim relace SCT funguje pro kontrakty Request-Reply, pokud zásobník vazby pod elementem vazby zabezpečení podporuje vytváření IDuplexChannel, IDuplexSessionChannelIRequestChannel nebo IRequestSessionChannel, instance.

Režim relace SCT funguje pro 1cestné kontrakty, pokud sada vazeb pod elementem vazby zabezpečení podporuje vytváření IDuplexChannel, IDuplexSessionChannelIRequestChannel nebo IRequestSessionChannel instance.

Odvození ze standardní vazby

Místo vytvoření zcela nové třídy vazby může být možné rozšířit jednu ze stávajících systémových vazeb. Podobně jako v předchozím případě musíte přepsat metodu CreateBindingElementsScheme a vlastnost.

Viz také