Duplex
Duplexní ukázka ukazuje, jak definovat a implementovat duplexní kontrakt. Duplexní komunikace nastane, když klient vytvoří relaci se službou a poskytne službě kanál, na kterém může služba odesílat zprávy zpět klientovi. Tato ukázka je založená na začínáme. Duplexní kontrakt je definován jako dvojice rozhraní – primární rozhraní z klienta do služby a rozhraní zpětného volání ze služby do klienta. V této ukázce ICalculatorDuplex
rozhraní umožňuje klientovi provádět matematické operace a vypočítat výsledek v rámci relace. Služba vrátí výsledky v ICalculatorDuplexCallback
rozhraní. Duplexní kontrakt vyžaduje relaci, protože musí být vytvořen kontext pro korelaci sady zpráv odesílaných mezi klientem a službou.
Poznámka:
Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.
V této ukázce je klient konzolovou aplikací (.exe) a služba je hostovaná Internetová informační služba (IIS). Duplexní kontrakt je definován takto:
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required,
CallbackContract=typeof(ICalculatorDuplexCallback))]
public interface ICalculatorDuplex
{
[OperationContract(IsOneWay = true)]
void Clear();
[OperationContract(IsOneWay = true)]
void AddTo(double n);
[OperationContract(IsOneWay = true)]
void SubtractFrom(double n);
[OperationContract(IsOneWay = true)]
void MultiplyBy(double n);
[OperationContract(IsOneWay = true)]
void DivideBy(double n);
}
public interface ICalculatorDuplexCallback
{
[OperationContract(IsOneWay = true)]
void Result(double result);
[OperationContract(IsOneWay = true)]
void Equation(string eqn);
}
Třída CalculatorService
implementuje primární ICalculatorDuplex
rozhraní. Služba používá PerSession režim instance k zachování výsledku pro každou relaci. Privátní vlastnost s názvem Callback
se používá pro přístup ke kanálu zpětného volání klientovi. Služba používá zpětné volání pro odesílání zpráv zpět klientovi prostřednictvím rozhraní zpětného volání.
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class CalculatorService : ICalculatorDuplex
{
double result = 0.0D;
string equation;
public CalculatorService()
{
equation = result.ToString();
}
public void Clear()
{
Callback.Equation($"{equation} = {result}");
equation = result.ToString();
}
public void AddTo(double n)
{
result += n;
equation += $" + {n}";
Callback.Result(result);
}
//...
ICalculatorDuplexCallback Callback
{
get
{
return OperationContext.Current.GetCallbackChannel<ICalculatorDuplexCallback>();
}
}
}
Klient musí poskytnout třídu, která implementuje rozhraní zpětného volání duplexního kontraktu pro příjem zpráv ze služby. V ukázce CallbackHandler
je třída definována pro implementaci ICalculatorDuplexCallback
rozhraní.
public class CallbackHandler : ICalculatorDuplexCallback
{
public void Result(double result)
{
Console.WriteLine("Result({0})", result);
}
public void Equation(string equation)
{
Console.WriteLine("Equation({0}", equation);
}
}
Proxy, který se generuje pro duplexní kontrakt, vyžaduje InstanceContext poskytnutí při konstrukci. Používá InstanceContext se jako lokalita pro objekt, který implementuje rozhraní zpětného volání a zpracovává zprávy odeslané zpět ze služby. Vytvoří se InstanceContext s instancí CallbackHandler
třídy. Tento objekt zpracovává zprávy odeslané ze služby klientovi v rozhraní zpětného volání.
// Construct InstanceContext to handle messages on callback interface.
InstanceContext instanceContext = new InstanceContext(new CallbackHandler());
// Create a client.
CalculatorDuplexClient client = new CalculatorDuplexClient(instanceContext);
Console.WriteLine("Press <ENTER> to terminate client once the output is displayed.");
Console.WriteLine();
// Call the AddTo service operation.
double value = 100.00D;
client.AddTo(value);
// Call the SubtractFrom service operation.
value = 50.00D;
client.SubtractFrom(value);
// Call the MultiplyBy service operation.
value = 17.65D;
client.MultiplyBy(value);
// Call the DivideBy service operation.
value = 2.00D;
client.DivideBy(value);
// Complete equation.
client.Clear();
Console.ReadLine();
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();
Konfigurace byla upravena tak, aby poskytovala vazbu, která podporuje komunikaci relace i duplexní komunikaci. Podporuje wsDualHttpBinding
komunikaci relací a umožňuje duplexní komunikaci tím, že poskytuje duální připojení HTTP, jedno pro každý směr. Jediným rozdílem v konfiguraci ve službě je použitá vazba. V klientovi musíte nakonfigurovat adresu, kterou server může použít pro připojení k klientovi, jak je znázorněno v následující ukázkové konfiguraci.
<client>
<endpoint name=""
address="http://localhost/servicemodelsamples/service.svc"
binding="wsDualHttpBinding"
bindingConfiguration="DuplexBinding"
contract="Microsoft.ServiceModel.Samples.ICalculatorDuplex" />
</client>
<bindings>
<!-- Configure a binding that support duplex communication. -->
<wsDualHttpBinding>
<binding name="DuplexBinding"
clientBaseAddress="http://localhost:8000/myClient/">
</binding>
</wsDualHttpBinding>
</bindings>
Při spuštění ukázky se zobrazí zprávy, které se vrátí klientovi v rozhraní zpětného volání odeslaného ze služby. Zobrazí se každý zprostředkující výsledek následovaný celou rovnicí po dokončení všech operací. Stisknutím klávesy ENTER ukončete klienta.
Nastavení, sestavení a spuštění ukázky
Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.
Pokud chcete sestavit edici C#, C++ nebo Visual Basic .NET řešení, postupujte podle pokynů v části Sestavení ukázek windows Communication Foundation.
Pokud chcete spustit ukázku v konfiguraci s jedním nebo více počítači, postupujte podle pokynů v části Spuštění ukázek windows Communication Foundation.
Důležité
Při spuštění klienta v konfiguraci mezi počítači nezapomeňte nahradit "localhost" v
address
atributu <koncového bodu><elementu klienta> iclientBaseAddress
atribut <elementu vazby <>elementu wsDualHttpBinding> názvem příslušného počítače, jak je znázorněno v následujícím příkladu:<client> <endpoint name = "" address="http://service_machine_name/servicemodelsamples/service.svc" ... /> </client> ... <wsDualHttpBinding> <binding name="DuplexBinding" clientBaseAddress="http://client_machine_name:8000/myClient/"> </binding> </wsDualHttpBinding>