Один из способов сделать это - создать класс «Global» с постоянными значениями и выполнить статический импорт в классы, которым требуется доступ к константе.
Вот простейший полный пример, который я могу придумать:
public interface IMyContractCallback
{
[OperationContract]
void OnCallback();
}
[ServiceContract(CallbackContract = typeof(IMyContractCallback))]
public interface IMyContract
{
[OperationContract]
void DoSomething();
}
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
public class MyService : IMyContract
{
public void DoSomething()
{
Console.WriteLine("Hi from server!");
var callback = OperationContext.Current.GetCallbackChannel<IMyContractCallback>();
callback.OnCallback();
}
}
public class MyContractClient : DuplexClientBase<IMyContract>
{
public MyContractClient(object callbackInstance, Binding binding, EndpointAddress remoteAddress)
: base(callbackInstance, binding, remoteAddress) { }
}
public class MyCallbackClient : IMyContractCallback
{
public void OnCallback()
{
Console.WriteLine("Hi from client!");
}
}
class Program
{
static void Main(string[] args)
{
var uri = new Uri("net.tcp://localhost");
var binding = new NetTcpBinding();
var host = new ServiceHost(typeof(MyService), uri);
host.AddServiceEndpoint(typeof(IMyContract), binding, "");
host.Open();
var callback = new MyCallbackClient();
var client = new MyContractClient(callback, binding, new EndpointAddress(uri));
var proxy = client.ChannelFactory.CreateChannel();
proxy.DoSomething();
// Printed in console:
// Hi from server!
// Hi from client!
client.Close();
host.Close();
}
}
Чтобы запустить пример, необходимо включить несколько пространств имен:
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
Возьмите копию «Программирование служб WCF, 2-е издание» Жюваля Лоуи. В книге есть большие разделы, посвященные Callback-операциям. Глава 5 начинается со страницы 214. В главе, посвященной управлению параллелизмом (глава 8), есть еще больше информации.
«Программирование служб WCF» - это более или менее «библия» WCF.
Если я правильно прочитал ваш вопрос, вы хотите иметь двусторонний диалог между клиентом и сервером (сервер может связываться с клиентом). WSDualHttpBinding предоставляет вам эту функциональность.
К сожалению, с WCF не существует такой вещи, как простой пример. Это требует, чтобы вы определяли контракты, настраивали службы и использовали хост, а также создавали клиентский код. Взгляните на эту статью , чтобы увидеть довольно простой пример.