Время жизни дуплексной переменной ограничено методом Form1_Load.Это означает, что ваш хост прекратит работу после завершения метода.Чтобы поддерживать работающий хост, объявите дуплексную переменную вне метода и просто создайте ее экземпляр в методе.
Примерно так:
public partial class Form1 : Form {
//Declare the variable in the class, not the method body
private ServiceHost duplex;
public Form1() {
InitializeComponent();
}
// once the form loads open a new ServiceEndpoint.
private void Form1_Load(object sender, EventArgs e) {
duplex = new ServiceHost(typeof(ServerWCallbackImpl));
duplex.AddServiceEndpoint(typeof(IServerWithCallback), new NetTcpBinding(), "net.tcp://localhost:9080/service");
duplex.Open();
this.Text = "SERVER *on-line*";
}
private void buttonSendMsg_Click(object sender, EventArgs e) {
/// callback.Message_Server2Client(textBox2.Text);
/// The name 'Message_Server2Client' does not exist in the current context :(
}
}
EDIT1:
Если создан экземпляр ServiceHostс типом, как в вашем примере, экземпляр этого типа будет создан для каждого соединения.Вы можете установить время жизни экземпляра для сеанса, вызова или соединения, как я полагаю.Я не уверен, как этот объект будет иметь доступ к вашей форме, хотя.Однако, если вы сами создадите экземпляр класса ServerWCallbackImpl и передадите ссылку на хост, этот экземпляр будет использован.
public partial class Form1 : Form {
//Declare the variable in the class, not the method body
private ServiceHost duplex;
private ServerWithCallbackImpl localInstance;
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
localInstance = new ServerWithCallbackImpl();
NetTcpBinding binding = new NetTcpBinding ();
duplex = new ServiceHost(localInstance, new Uri[] { new Uri("net.tcp://localhost:9080") });
duplex .AddServiceEndpoint(typeof(IServerWithCallback), binding, "service");
duplex .Open();
this.Text = "SERVER *on-line*";
}
}
Затем объект ServerWithCallbackImpl должен будет отслеживать своих клиентов.Чтобы сервер обновил графический интерфейс, вы можете передать ссылку на форму в качестве параметра в конструктор ServerWithCallbackImpl.Взгляните на шаблон публикации / подписчика , чтобы получить более глубокое понимание обратных вызовов.