Jednosměrné služby
Výchozí chování operace služby je vzor odpovědi na požadavek. V modelu odpovědi na požadavek klient čeká na zprávu odpovědi, i když je operace služby reprezentována v kódu jako void
metoda. Při jednosměrné operaci se přenese pouze jedna zpráva. Příjemce neodesílá zprávu odpovědi ani odesílatele neočekává.
Použijte jednosměrný vzor návrhu:
Když klient musí volat operace a není ovlivněn výsledkem operace na úrovni operace.
Při použití NetMsmqBinding třídy.MsmqIntegrationBinding (Další informace o tomto scénáři najdete v tématu Fronty ve WCF.)
Pokud je operace jednosměrná, neexistuje žádná zpráva odpovědi, která by do klienta přenesla informace o chybách. Chybové stavy můžete zjistit pomocí funkcí podkladové vazby, jako jsou spolehlivé relace, nebo pomocí návrhu duplexního kontraktu služby, který používá dvě jednosměrné operace – jednosměrný kontrakt od klienta do služby pro volání operace služby a další jednosměrný kontrakt mezi službou a klientem, aby služba mohl klientovi odesílat chyby pomocí zpětného volání, které klient implementuje.
Pokud chcete vytvořit jednosměrný kontrakt služby, definujte kontrakt služby, použijte OperationContractAttribute třídu na každou operaci a nastavte IsOneWay vlastnost na true
, jak je znázorněno v následujícím vzorovém kódu.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface IOneWayCalculator
{
[OperationContract(IsOneWay=true)]
void Add(double n1, double n2);
[OperationContract(IsOneWay = true)]
void Subtract(double n1, double n2);
[OperationContract(IsOneWay = true)]
void Multiply(double n1, double n2);
[OperationContract(IsOneWay = true)]
void Divide(double n1, double n2);
}
Úplný příklad najdete v ukázce jednosměrných cest .
Klienti blokující jednosměrné operace
Je důležité si uvědomit, že zatímco některé jednosměrné aplikace se vrátí hned po zápisu odchozích dat do síťového připojení, v několika scénářích může implementace vazby nebo služby způsobit zablokování klienta WCF pomocí jednosměrných operací. V klientských aplikacích WCF se objekt klienta WCF nevrací, dokud nebudou odchozí data zapsána do síťového připojení. To platí pro všechny vzory výměny zpráv, včetně jednosměrných operací; to znamená, že jakýkoli problém při zápisu dat do přenosu brání klientovi v návratu. V závislosti na problému může být výsledkem výjimka nebo zpoždění při odesílání zpráv do služby.
Pokud například přenos nemůže najít koncový bod, vyvolá System.ServiceModel.EndpointNotFoundException se výjimka bez velkého zpoždění. Je však také možné, že služba nemůže číst data z přenosového přenosu z nějakého důvodu, což brání vrácení operace přenosu klienta. Pokud je v těchto případech Binding.SendTimeout překročeno období vazby přenosu klienta, System.TimeoutException dojde k vyvolání , ale ne do překročení časového limitu. Ve službě je také možné aktivovat tolik zpráv, že je služba nemůže zpracovat za určitý bod. V tomto případě také jednosměrný klient blokuje, dokud služba nemůže zpracovat zprávy nebo dokud se nevyvolá výjimka.
Další variantou je situace, ve které je vlastnost služby ServiceBehaviorAttribute.ConcurrencyMode nastavena Single a vazba používá relace. V tomto případě dispečer vynucuje řazení příchozích zpráv (požadavek na relace), což brání následnému čtení ze sítě, dokud služba nezpracovala předchozí zprávu pro danou relaci. Klient opět blokuje, ale jestli dojde k výjimce, závisí na tom, jestli služba dokáže zpracovat čekající data před nastavením časového limitu klienta.
Některé z těchto problémů můžete zmírnit vložením vyrovnávací paměti mezi objekt klienta a operaci odeslání přenosu klienta. Například pomocí asynchronních volání nebo použití fronty zpráv v paměti může objekt klienta rychle vrátit. Oba přístupy můžou zvýšit funkčnost, ale velikost fondu vláken a fronty zpráv stále vynucuje limity.
Místo toho doporučujeme prozkoumat různé ovládací prvky služby i klienta a pak otestovat scénáře aplikace, abyste zjistili nejlepší konfiguraci na obou stranách. Pokud například použití relací blokuje zpracování zpráv ve vaší službě, můžete ServiceBehaviorAttribute.InstanceContextMode nastavit vlastnost tak PerCall , aby každá zpráva mohla být zpracována jinou instancí služby a nastavena ConcurrencyMode na Multiple hodnotu, aby bylo možné odesílat zprávy více než jedno vlákno najednou. Dalším přístupem je zvýšení kvót čtení služeb a klientských vazeb.