Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Aplikace pro vícesměrové vysílání odesílají malé zprávy velkému počtu příjemců najednou, aniž by bylo nutné navázat připojení typu point-to-point. U těchto aplikací je kladen důraz na rychlost před spolehlivostí. Jinými slovy, je důležitější odeslat včasná data, než zajistit, aby byla skutečně přijata jakákoli konkrétní zpráva. WCF nyní podporuje psaní vícesměrových aplikací pomocí nástroje UdpBinding. Tento přenos je užitečný ve scénářích, kdy služba potřebuje současně posílat malé zprávy řadě klientů. Příkladem takové služby je aplikace burzovního tickeru.
Implementace aplikace vícesměrového vysílání
Pokud chcete implementovat aplikaci vícesměrového vysílání, definujte kontrakt služby a pro každou softwarovou komponentu, která potřebuje reagovat na zprávy vícesměrového vysílání, implementujte kontrakt služby. Například aplikace akciového tickeru může definovat servisní smlouvu:
// Shared contracts between the client and the service
[ServiceContract]
interface IStockTicker
{
[OperationContract(IsOneWay = true)]
void SendStockInfo(StockInfo[] stockInfo);
}
[DataContract]
class StockInfo
{
[DataMember]
public string Symbol;
[DataMember]
public float Price;
public StockInfo(string symbol, float price)
{
this.Symbol = symbol;
this.Price = price;
}
}
Každá aplikace, která chce přijímat zprávy vícesměrového vysílání, musí hostovat službu, která toto rozhraní zveřejňuje. Tady je příklad kódu, který ukazuje, jak přijímat zprávy vícesměrového vysílání:
// Service Address
string serviceAddress = "soap.udp://224.0.0.1:40000";
// Binding
UdpBinding myBinding = new UdpBinding();
// Host
ServiceHost host = new ServiceHost(typeof(StockTickerService), new Uri(serviceAddress));
// Add service endpoint
host.AddServiceEndpoint(typeof(IStockTicker), myBinding, string.Empty);
// Open up the service host
host.Open();
Console.WriteLine("Start receiving stock information");
Console.ReadLine();
Aplikace určuje adresu UDP, na které budou všechny služby naslouchat. Vytvoří se nové ServiceHost a koncový bod služby je vystaven pomocí UdpBinding. Soubor ServiceHost se pak otevře a začne naslouchat příchozím zprávám.
V takovém typu scénáře je to klient, který ve skutečnosti odesílá zprávy vícesměrového vysílání. Každá služba, která naslouchá na správné adrese UDP, obdrží zprávy vícesměrového vysílání. Zde je příklad klienta, který odesílá multicastové zprávy:
// Multicast Address
string serviceAddress = "soap.udp://224.0.0.1:40000";
// Binding
UdpBinding myBinding = new UdpBinding();
// Channel factory
ChannelFactory<IStockTicker> factory
= new ChannelFactory<IStockTicker>(myBinding,
new EndpointAddress(serviceAddress));
// Call service
IStockTicker proxy = factory.CreateChannel();
while (true)
{
// This will continue to multicast stock information
proxy.SendStockInfo(GetStockInfo());
Console.WriteLine($"sent stock info at {DateTime.Now}");
// Wait for one second before sending another update
System.Threading.Thread.Sleep(new TimeSpan(0, 0, 1));
}
Tento kód vygeneruje informace o akciích a poté použije smlouvu služby IStockTicker k odeslání multicast zpráv, které vyvolávají služby naslouchající na správnou UDP adresu.
UDP a spolehlivé zasílání zpráv
Vazba UDP nepodporuje spolehlivé zasílání zpráv kvůli odlehčené povaze protokolu UDP. Pokud potřebujete potvrdit, že zprávy přijímají vzdálený koncový bod, použijte přenos, který podporuje spolehlivé zasílání zpráv, jako je HTTP nebo TCP. Další informace o spolehlivém zasílání zpráv naleznete v tématu https://go.microsoft.com/fwlink/?LinkId=231830.
Dvoucestné odesílání multicastových zpráv
I když jsou zprávy vícesměrového vysílání obecně jednosměrné, UdpBinding podporuje výměnu zpráv ve formátu request-reply. Zprávy odeslané pomocí přenosu UDP obsahují adresu Od i Komu. Při použití adresy Od je nutné dbát opatrnosti, protože může být během přenosu změněna se zlými úmysly. Adresu je možné zkontrolovat pomocí následujícího kódu:
if (address.AddressFamily == AddressFamily.InterNetwork)
{
// IPv4
byte[] addressBytes = address.GetAddressBytes();
return ((addressBytes[0] & 0xE0) == 0xE0);
}
else
{
// IPv6
return address.IsIPv6Multicast;
}
Tento kód zkontroluje první bajt adresy From a zjistí, jestli obsahuje 0xE0, což označuje, že adresa je multicastová adresa.
Aspekty zabezpečení
Při naslouchání zpráv vícesměrovým vysíláním se paket ICMP odešle směrovači s oznámením, že nasloucháte na adrese vícesměrového vysílání. Kdokoli v místní podsíti, která má oprávnění, může naslouchat těmto typům paketů a určit, na které adrese vícesměrového vysílání a portu nasloucháte.
Nepoužívejte IP adresu odesílatele pro žádné bezpečnostní účely. Tyto informace můžou být falšované a můžou způsobit, že aplikace odešle odpovědi na nesprávný počítač. Jedním ze způsobů, jak tuto hrozbu zmírnit, je povolit zabezpečení na úrovni zpráv. Je také možné použít protokol IPSec (Internet Protocol Security) a/nebo NAP (Network Access Protection).