Megosztás a következőn keresztül:


Egyirányú szolgáltatások

A szolgáltatásművelet alapértelmezett viselkedése a kérés-válasz minta. A kérés-válasz mintában az ügyfél megvárja a válaszüzenetet, még akkor is, ha a szolgáltatásművelet kódban, metódusként void jelenik meg. Egyirányú művelet esetén a rendszer csak egy üzenetet továbbít. A fogadó nem küld válaszüzenetet, és a feladó sem vár egyet.

Használja az egyirányú tervezési mintát:

Ha egy művelet egyirányú, nem jelenik meg válaszüzenet a hibainformációknak az ügyfélnek való visszaszolgáltatásához. A hibafeltételeket az alapul szolgáló kötés funkciói, például a megbízható munkamenetek, vagy egy kétirányú szolgáltatási szerződés kialakításával észlelheti, amely két egyirányú műveletet használ – egy egyirányú szerződést az ügyféltől a szolgáltatáshoz a szolgáltatás hívásához, valamint egy másik egyirányú szerződést a szolgáltatás és az ügyfél között, hogy a szolgáltatás visszaküldhesse a hibákat az ügyfélnek az ügyfél által implementálandó visszahívással.

Egyirányú szolgáltatási szerződés létrehozásához definiálja a szolgáltatási szerződést, alkalmazza az osztályt az OperationContractAttribute egyes műveletekre, és állítsa a IsOneWay tulajdonságot truea következő mintakódban látható módon.

[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);  
}  

A teljes példáért tekintse meg az Egyirányú mintát.

Ügyfelek blokkolása egyirányú műveletekkel

Fontos tisztában lennie azzal, hogy míg egyes egyirányú alkalmazások azonnal visszatérnek, amint a kimenő adatok meg vannak írva a hálózati kapcsolatra, számos esetben egy kötés vagy szolgáltatás implementálása egy WCF-ügyfél letiltását okozhatja egyirányú műveletek használatával. A WCF-ügyfélalkalmazásokban a WCF-ügyfélobjektum csak akkor tér vissza, ha a kimenő adatok a hálózati kapcsolatra lettek írva. Ez minden üzenetváltási mintára igaz, beleértve az egyirányú műveleteket is; Ez azt jelenti, hogy az adatok átvitelre való írásával kapcsolatos problémák megakadályozzák az ügyfél visszatérését. A problémától függően az eredmény lehet kivétel vagy a szolgáltatásnak küldött üzenetek késleltetése.

Ha például az átvitel nem találja a végpontot, a rendszer kivételt System.ServiceModel.EndpointNotFoundException okoz. Előfordulhat azonban, hogy a szolgáltatás valamilyen okból nem tudja leolvasni az adatokat a vezetékről, ami megakadályozza, hogy az ügyfélátviteli küldési művelet visszatérjen. Ezekben az esetekben, ha az Binding.SendTimeout ügyfél-átviteli kötés időszaka túllépi az időtartamot, a rendszer eldob egy System.TimeoutException értéket – de csak az időtúllépési időszak túllépéséig. Olyan sok üzenetet is el lehet küldeni egy szolgáltatásban, hogy a szolgáltatás nem tudja feldolgozni őket egy adott ponton túl. Ebben az esetben is az egyirányú ügyfél letiltja, amíg a szolgáltatás nem tudja feldolgozni az üzeneteket, vagy amíg kivétel nem történik.

Egy másik változat az a helyzet, amelyben a szolgáltatástulajdonság ServiceBehaviorAttribute.ConcurrencyMode be van állítva, Single és a kötés munkameneteket használ. Ebben az esetben a kézbesítő kényszeríti a rendelést a bejövő üzeneteken (a munkamenetek követelménye), ami megakadályozza, hogy a további üzenetek le legyenek olvasva a hálózatról, amíg a szolgáltatás feldolgozta az adott munkamenet előző üzenetét. Az ügyfél ismét letiltja, de a kivétel attól függ, hogy a szolgáltatás képes-e feldolgozni a várakozási adatokat az ügyfél időtúllépési beállításai előtt.

A probléma egy részének megoldásához szúrjon be egy puffert az ügyfélobjektum és az ügyfélátvitel küldési művelete közé. Például aszinkron hívások vagy a memórián belüli üzenetsor használata lehetővé teszi az ügyfélobjektum gyors visszatérését. Mindkét módszer növelheti a funkcionalitást, de a szálkészlet és az üzenetsor mérete továbbra is korlátokat szab.

Ehelyett javasoljuk, hogy vizsgálja meg a szolgáltatás és az ügyfél különböző vezérlőit, majd tesztelje az alkalmazásforgatókönyveket, hogy mindkét oldalon a legjobb konfigurációt határozza meg. Ha például a munkamenetek használata blokkolja az üzenetek feldolgozását a szolgáltatásban, beállíthatja ServiceBehaviorAttribute.InstanceContextMode a tulajdonságot PerCall úgy, hogy az egyes üzeneteket egy másik szolgáltatáspéldány dolgozza fel, és állítsa be úgy ConcurrencyModeMultiple , hogy egyszerre több szál is küldhessen üzeneteket. Egy másik megközelítés a szolgáltatás és az ügyfélkötések olvasási kvótáinak növelése.

Lásd még