Доброе время суток.
Только разбираюсь с WCF, возник вопрос: как мне разместить сервис вместе с WinForms приложением и иметь доступ к объектам формы, если такое возможно?
Здравствуйте, Аноним, Вы писали:
А>Доброе время суток. А>Только разбираюсь с WCF, возник вопрос: как мне разместить сервис вместе с WinForms приложением и иметь доступ к объектам формы, если такое возможно?
Зачем такое может понадобиться?
Re[2]: WCF
От:
Аноним
Дата:
21.03.10 19:13
Оценка:
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Аноним, Вы писали:
А>>Доброе время суток. А>>Только разбираюсь с WCF, возник вопрос: как мне разместить сервис вместе с WinForms приложением и иметь доступ к объектам формы, если такое возможно?
L>Зачем такое может понадобиться?
Активировать тот или иной компонет формы в зависимости от вызванного метода сервиса. Само это приложение вместе с сервисом будет размещено на сервере, и с него планируется отправка сообщений клиентам(формирует сообщения и выбирает кому их отправлять оператор).
Здравствуйте, Аноним, Вы писали:
L>>Зачем такое может понадобиться?
А>Активировать тот или иной компонет формы в зависимости от вызванного метода сервиса. Само это приложение вместе с сервисом будет размещено на сервере, и с него планируется отправка сообщений клиентам(формирует сообщения и выбирает кому их отправлять оператор).
Для этого не нужно в приложении хостить сервис. Сделайте периодический опрос сервиса и в зависимости от ответа, меняйте интерфейс.
Re[4]: WCF
От:
Аноним
Дата:
21.03.10 19:49
Оценка:
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Аноним, Вы писали:
L>>>Зачем такое может понадобиться?
А>>Активировать тот или иной компонет формы в зависимости от вызванного метода сервиса. Само это приложение вместе с сервисом будет размещено на сервере, и с него планируется отправка сообщений клиентам(формирует сообщения и выбирает кому их отправлять оператор).
L>Для этого не нужно в приложении хостить сервис. Сделайте периодический опрос сервиса и в зависимости от ответа, меняйте интерфейс.
А есть возможность перенаправить часть сообщения одного клиента другому, или сервисом вызвать определенный клиент и передать ему сообщение?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Lloyd, Вы писали:
L>>Здравствуйте, Аноним, Вы писали:
L>>>>Зачем такое может понадобиться?
А>>>Активировать тот или иной компонет формы в зависимости от вызванного метода сервиса. Само это приложение вместе с сервисом будет размещено на сервере, и с него планируется отправка сообщений клиентам(формирует сообщения и выбирает кому их отправлять оператор).
L>>Для этого не нужно в приложении хостить сервис. Сделайте периодический опрос сервиса и в зависимости от ответа, меняйте интерфейс.
А>А есть возможность перенаправить часть сообщения одного клиента другому, или сервисом вызвать определенный клиент и передать ему сообщение?
Идея в том, что ты создаешь вместо ChannelFactory — DuplexChannelFactory и используешь callback объект.
Каждый клиент при вызове метода сервиса регистрицуется на сервисе, и при наступлении определенных условий, сервис оповещает клиента.
Примеры ищи по ключевым словам wcf, DuplexChannelFactory, callback
Здравствуйте, Аноним, Вы писали:
А>Доброе время суток. А>Только разбираюсь с WCF, возник вопрос: как мне разместить сервис вместе с WinForms приложением и иметь доступ к объектам формы, если такое возможно?
Вполне возможно, и вариантов реализации множество. Как, пожалуй, простейший — сделать приложение с синглетоном, роль которого, как вариант, может выполнять главная форма:
using System.ServiceModel;
namespace FormSingletonInterface
{
[ServiceContract()]
public interface IFormInterface
{
[OperationContract]
void SetLabelText(string NewText);
}
}
using System.ServiceModel;
using System.Windows.Forms;
using FormSingletonInterface;
namespace FormSingleton
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public partial class Form1 : Form, IFormInterface
{
ServiceHost host;
public Form1()
{
InitializeComponent();
host = new ServiceHost(this);
var binding = new NetNamedPipeBinding();
var endPoint = host.AddServiceEndpoint(
typeof(IFormInterface), binding, "net.pipe://localhost/FormSingleton");
host.Open();
}
void IFormInterface.SetLabelText(string NewText)
{
// В некоторых случаях здесь может потребоваться Control.Invoke
label1.Text = NewText;
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
host.Close();
host = null;
}
}
}
И клиент для теста
static void Main()
{
var binding = new NetNamedPipeBinding();
var chlFactory = new ChannelFactory<IFormInterface>(binding,
new EndpointAddress("net.pipe://localhost/FormSingleton"));
var client = chlFactory.CreateChannel();
client.SetLabelText("New text");
}
JR> void IFormInterface.SetLabelText(string NewText)
JR> {
JR> // В некоторых случаях здесь может потребоваться Control.Invoke
JR> label1.Text = NewText;
JR> }
Здравствуйте, Jolly Roger, Вы писали:
JR>А можно пояснить, что именно здесь плохо? Для повышения образованности
1. Синглетный сервис.
2. Мешанина из логики и представления.
3. Обращение к наследнику Control из метода сервиса, который в 99% случаев будет вызван из потока, отличного от того, в котором создан Control.
Здравствуйте, HowardLovekraft, Вы писали:
HL>Здравствуйте, Jolly Roger, Вы писали:
JR>>А можно пояснить, что именно здесь плохо? Для повышения образованности HL>1. Синглетный сервис.
Почему вдруг сервис? Самый обыкновенный сервер автоматизации И если логика требует синглетона, то и должен быть синглетон — куча существующих и успешных серверов автоматизации предоставляют рутовый объект именно в виде синглтона, и правильно делают.
А если не требует, то и не должен.
HL>2. Мешанина из логики и представления.
Это не "мешанина", а самый обычный упрощённый пример, демонстрирующий один из вариантов решения задачи топикстартера. Было-бы довольно глупо вываливать сюда полноценное приложение, чтобы продемонстрировать весьма простую вещь.
HL>3. Обращение к наследнику Control из метода сервиса, который в 99% случаев будет вызван из потока, отличного от того, в котором создан Control.
Этот метод в 100% случаев будет вызван в главном потоке приложения просто потому, что он в него транслируется WCF. А примечание написал потому, что не уверен, что так будет для всех типов каналов, и это требует проверки.
HL>Достаточно?
Нет, не достаточно, но продолжать не обязательно, Вашу мысль я уловил.