Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Çift yönlü örnek uygulama, çift yönlü sözleşmenin nasıl tanımlanacağını ve uygulanacağını gösterir. Çift yönlü iletişim, istemci bir hizmetle oturum oluşturduğunda ve hizmete hizmetin istemciye ileti gönderebileceği bir kanal verdiğinde gerçekleşir. Bu örnek, "Başlarken" üzerine kurulmuştur. Çift yönlü sözleşme, istemciden hizmete birincil arabirim ve hizmetten istemciye geriye çağrı arabiriminin oluşturduğu bir arabirim çifti olarak tanımlanır. Bu örnekte arabirim, ICalculatorDuplex istemcinin bir oturum üzerinden sonucu hesaplayarak matematik işlemleri gerçekleştirmesine olanak tanır. Hizmet, arabirimde ICalculatorDuplexCallback sonuçları döndürür. İstemci ile hizmet arasında gönderilen ileti kümesini ilişkilendirmek için bir bağlam oluşturulması gerektiğinden çift yönlü sözleşme oturum gerektirir.
Uyarı
Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.
Bu örnekte, istemci bir konsol uygulamasıdır (.exe) ve hizmet Internet Information Services (IIS) tarafından barındırılır. Çift yönlü sözleşme aşağıdaki gibi tanımlanır:
[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);
}
CalculatorService sınıfı birincil ICalculatorDuplex arabirimini uygular. Hizmet, her oturum için PerSession sonucu korumak için örnek modunu kullanır. İstemciye geri çağırma kanalına erişmek için bir özel özellik olarak Callback kullanılır. Hizmet, geri çağırma arabirimi aracılığıyla istemciye ileti göndermek için geri çağırmayı kullanır.
[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>();
}
}
}
İstemci, hizmetten ileti almak için çift yönlü sözleşmenin geri çağırma arabirimini uygulayan bir sınıf sağlamalıdır. Örnekte, CallbackHandler arabirimini uygulamak için bir ICalculatorDuplexCallback sınıfı tanımlanır.
public class CallbackHandler : ICalculatorDuplexCallback
{
public void Result(double result)
{
Console.WriteLine("Result({0})", result);
}
public void Equation(string equation)
{
Console.WriteLine("Equation({0}", equation);
}
}
Çift yönlü sözleşme için oluşturulan ara sunucu, oluşturma esnasında bir InstanceContext sağlanmasını gerektirir. Bu InstanceContext , geri çağırma arabirimini uygulayan ve hizmetten geri gönderilen iletileri işleyen bir nesnenin sitesi olarak kullanılır.
InstanceContext, CallbackHandler sınıfının bir örneğiyle oluşturulur. Bu nesne, hizmetten istemciye geri çağırma arabiriminde gönderilen iletileri işler.
// 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();
Yapılandırma, hem oturum iletişimini hem de çift yönlü iletişimi destekleyen bir bağlama sağlayacak şekilde değiştirildi.
wsDualHttpBinding oturum iletişimini destekler ve her yön için iki ayrı HTTP bağlantısı sağlayarak çift yönlü iletişime izin verir. Hizmette yapılandırmadaki tek fark kullanılan bağlamadır. İstemcide, aşağıdaki örnek yapılandırmada gösterildiği gibi sunucunun istemciye bağlanmak için kullanabileceği bir adres yapılandırmanız gerekir.
<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>
Örneği çalıştırdığınızda, hizmetten gönderilen geri çağırma arabiriminde istemciye döndürülen iletileri görürsünüz. Her ara sonuç görüntülenir ve ardından tüm işlemler tamamlandıktan sonra denklemin tamamı görüntülenir. İstemciyi kapatmak için ENTER tuşuna basın.
Örneği ayarlamak, derlemek ve çalıştırmak için
Windows Communication Foundation Örnekleri içinOne-Time Kurulum Yordamını yaptığınızdan emin olun.
Çözümün C#, C++ veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığı altındaki yönergeleri izleyin.
Örneği tek bir makine veya makineler arası bir yapılandırmada çalıştırmak için, Windows Communication Foundation örneklerini çalıştırmayönergelerini izleyin.
Önemli
İstemciyi makineler arası yapılandırmada çalıştırırken, aşağıda gösterildiği gibi hem
address<><><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>