C# - 如何从服务外部调用WCF回调调用

时间:2017-12-06 09:56:54

标签: c# .net wcf callback

我有一个作为服务运行的解决方案,并通过WCF与另一个应用程序通信。 基本上我添加了WCF服务库并将服务合同定义为“CallbackContract”

[ServiceContract(CallbackContract = typeof(IKioskWcfCallback))]
public interface IKioskWcfService
{
    [OperationContract]
    void OpenSession();
}

public interface IKioskWcfCallback
{

    [OperationContract]
    void OnCallback();
}

我使用ServiceHost类

从主项目启动WCF服务
        Wcfservice = new ServiceHost(typeof(KioskWcf.KioskWcfService));
        Wcfservice.Open();

从WCF Web服务内部,我可以毫无问题地调用回调。我在客户端连接时保存回调引用,稍后再调用该回调。

public class KioskWcfService : IKioskWcfService
{
    public static IKioskWcfCallback Callback;
    public static Timer Timer;

    public void OpenSession()
    {
        Console.WriteLine("> Session opened at {0}", DateTime.Now);
        Callback = OperationContext.Current.GetCallbackChannel<IKioskWcfCallback>();

        Timer = new Timer(3000);
        Timer.Elapsed += OnTimerElapsed;
        Timer.Enabled = true;
    }
    void OnTimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        Callback.OnCallback();
    }

现在,我想在项目的其他部分调用回调,但我不知道如何引用连接客户端的回调。

我在一些答案中看到一个方法GetClients()存在但在我的情况下VS 2015不提供该方法。

这是我的App.cfg

      <service name="KioskWcf.KioskWcfService">
    <endpoint address="" binding="wsDualHttpBinding" contract="KioskWcf.IKioskWcfService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8090/KioskWcf/KioskWcfService/" />
      </baseAddresses>
    </host>
  </service>

非常感谢。

1 个答案:

答案 0 :(得分:0)

我想在项目的其他部分调用回调

您可以做的是,在客户端应用程序中或您想要调用此回调的任何位置,您必须在客户端应用程序中实现回调接口。

假设 MyClient 应用程序是您要使用或调用IKioskWcfCallback的客户端或其他项目,那么

class MyClient :KioskNamespace.IKioskWcfCallback 
{
  //control is returned from callback to here.
  public void OnCallback()
  {

  }
}