2015-03-09 3 views
0

Я пытаюсь создать службу WCF для обработки клиентских запросов и изменения базы данных. Помимо моих пользователей, у меня также есть другие интерфейсы, которые могут вызывать мою службу WCF и изменять базу данных.вызовы службы WCF для клиентов

Моя проблема заключается в том, что я хочу уведомить своих клиентов о изменении базы данных из-за моего другого интерфейса.

В основном: клиенты работают, служба WCF, размещенная WAS/IIS, изменения в базе данных и служба должны уведомить всех моих подключенных клиентов об изменении.

Мои пользовательские клиенты - это простые приложения WinForms, на которые ссылается служба.

Я хотел был бы избежать инициировать звонки от клиентов и ждать ответа, я хотел бы, чтобы служба совершила звонок в направлении клиентов.

Мой вопрос в том, что есть способ реализовать это, или я должен использовать что-то вроде слушателя?

ответ

1

Этого можно достичь в WCF.

Реализуйте так называемый «дуплексный шаблон связи», который представляет собой в основном два односторонних контракта.

Here is an MSDN article for just that... How to: Create a Duplex Contract

«В этом разделе показаны основные шаги по созданию методов, которые используют дуплекс (двухсторонняя) контракт. Дуплексный контракт позволяет клиентам и серверам связываться друг с другом независимо друг от друга, так что любой из них может инициировать вызовы в другой. Дуплексный контракт является одним из трех шаблонов сообщений, доступных для служб Windows Communication Foundation (WCF). Два других шаблона сообщений являются однонаправленными и требуют ответа. Дуплексный договор состоит из двух односторонних контрактов между клиентом и сервер и не требует корреляции вызовов метода. Используйте этот вид контракта, когда ваша служба должна запросить клиента для получения дополнительной информации или явного повышения событий на клиенте. "

Encase они принимают страницу вниз, и я не очень нравится, только ссылка ответы ...

// Define a duplex service contract. 
// A duplex contract consists of two interfaces. 
// The primary interface is used to send messages from client to service. 
// The callback interface is used to send messages from service back to client. 
// ICalculatorDuplex allows one to perform multiple operations on a running result. 
    // The result is sent back after each operation on the ICalculatorCallback interface. 
[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); 
} 

// The callback interface is used to send messages from service back to client. 
// The Equals operation will return the current result after each operation. 
// The Equation opertion will return the complete equation after Clear() is called. 
public interface ICalculatorDuplexCallback 
{ 
    [OperationContract(IsOneWay = true)] 
    void Equals(double result); 
    [OperationContract(IsOneWay = true)] 
    void Equation(string eqn); 
} 

// Service class which implements a duplex service contract. 
// Use an InstanceContextMode of PerSession to store the result 
// An instance of the service will be bound to each duplex session 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
public class CalculatorService : ICalculatorDuplex 
{ 
    double result; 
    string equation; 
    ICalculatorDuplexCallback callback = null; 

    public CalculatorService() 
    { 
     result = 0.0D; 
     equation = result.ToString(); 
     callback = OperationContext.Current.GetCallbackChannel<ICalculatorDuplexCallback>(); 
    } 

    public void Clear() 
    { 
     callback.Equation(equation + " = " + result.ToString()); 
     result = 0.0D; 
     equation = result.ToString(); 
    } 

    public void AddTo(double n) 
    { 
     result += n; 
     equation += " + " + n.ToString(); 
     callback.Equals(result); 
    } 

    public void SubtractFrom(double n) 
    { 
     result -= n; 
     equation += " - " + n.ToString(); 
     callback.Equals(result); 
    } 

    public void MultiplyBy(double n) 
    { 
     result *= n; 
     equation += " * " + n.ToString(); 
     callback.Equals(result); 
    } 

    public void DivideBy(double n) 
    { 
     result /= n; 
     equation += "/" + n.ToString(); 
     callback.Equals(result); 
    } 
} 
+0

Спасибо, я уже нашел и реализовал этот шаблон. Моя проблема в том, что если мой сервер выйдет из строя. Если мое понимание верное, то IIS может выполнять служебную динамическую обработку только тогда, когда запрос поступает от клиентов. Итак, основной вопрос заключается в том, что есть способ сделать дуплексный шаблон без того, чтобы все время выполнялось обслуживание? –

+0

@ KrisztiánKis Посмотрите MSMQ, чтобы убедиться, что это то, что вы хотите, оно используется для создания надежной системы обмена сообщениями для систем, которые не всегда связаны ... https://msdn.microsoft.com/en-us/library /ms978430.aspx –

+0

@ KrisztiánKis Прочитайте «Руководство для начинающих по организации очереди с WCF и MSMQ», чтобы начать работу http://www.codeproject.com/Articles/520323/A-beginners-guide-to-queuing- с-ФОС-и-MSMQ-шо –

Смежные вопросы