【问题标题】:Can I get/set data into WCF Service by Host?我可以通过主机获取/设置数据到 WCF 服务吗?
【发布时间】:2016-11-15 15:45:10
【问题描述】:

我在 WindowsServiceHost 上托管了 WCF 服务(用于通信 WindowsFormsApp WindowsServiceHost)

有没有办法从 WCFService 获取数据到 WindowsServiceHost? 并以其他方式(将数据从 WindowsServiceHost 设置为 WCFService)

这就是我所做的:

  1. 我做了一个 WCF 服务库项目,实现了接口,契约等。
  2. 我创建了新项目 - Windows 服务并添加了对 #1 和 System.ServiceModel 项目的引用
  3. 已配置的 app.conf:

    <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="netTcp">
          <security mode="Message">
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="mexBehavior">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="mexBehavior" name="KSPDJOBWinWCFService.KSPDJOBWinWCFService" >
        <endpoint address="KSPDJOBWinWCFService" binding="netTcpBinding" contract="KSPDJOBWinWCFService.IKSPDJOBWinWCFService" bindingConfiguration="netTcp" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8079"/>
            <add baseAddress="net.tcp://localhost:8090"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    

  4. 我在 Windows 服务的 OnStart 方法中托管了 WCF

    protected override void OnStart(string[] args)
    {
        host = new ServiceHost(typeof(KSPDJOBWinWCFService.KSPDJOBWinWCFService));
        host.Open();
    }
    
  5. 使用 WinformsClient 应用程序(作为 WCF 客户端)添加了新解决方案并测试了通信 - 一切正常。

  6. 问题是当我从 WinFormsClient 向 WCF 服务发送一个值,并希望从 Windows 服务应用程序中读取它时

感谢您的帮助。

【问题讨论】:

  • 您是否将 WCF 服务托管在您已实现的 Windows 服务(由ServiceBase 派生的另一个服务)中?在您要交换数据的那些服务之间,是否正确?如果是这样,您能否粘贴您的 WCF 服务托管方式的代码?
  • 嗨,马克我回答了你

标签: c# wcf


【解决方案1】:

您可以将 WCF 服务实例保存在全局变量中并使用事件。在此示例中,WCF 服务KSPDJOBWinWCFService 公开了一个事件EventA,服务主机将处理它。这是您可以处理 WCF 客户端发送的值的地方。

public partial class Service : ServiceBase
{
    private ServiceHost _host;
    private KSPDJOBWinWCFService _instance;

    protected override void OnStart(string[] args)
    {
        try
        {
            _instance = new KSPDJOBWinWCFService();
            _instance.EventA += HandleEventA;
            _host = new ServiceHost(_instance);
            _host.Open();
        }
        catch (Exception ex)
        {
            // Logging
        }
    }

    public void HandleEventA(object sender, CustomEventArgs e)
    {
        // do whatever you want here
        var localVar = e.Value;
    }

    protected override void OnStop()
    {
        try
        {
            if (_instance != null)
            {
                _instance.Dispose();
            }
            _host.Close();
        }
        catch (Exception ex)
        {
            // Logging
        }
    }
}

WCF 服务随后会触发此事件以及从 WCF 客户端发送的值:

public class KSPDJOBWinWCFService : IKSPDJOBWinWCFService
{
    public event EventHandler<CustomEventArgs> EventA;

    public bool SomeWcfOperation(int value)
    {
        EventA?.Invoke(this, new CustomEventArgs(value));

        return true;
    }
}

创建满足您需求的事件参数:

public class CustomEventArgs : EventArgs
{
    public int Value { get; set; }

    public CustomEventArgs(int value)
    {
        Value = value;
    }
}

您还可以在 WCF 服务中使用公共属性公开值。但事件也是必要的。

【讨论】:

  • 像伤害一样工作 :)) 感谢 Marc 提供的精彩教程。我必须在我的 WCFService 类下面添加[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]public class KSPDJOBWinWCFService : IKSPDJOBWinWCFService
猜你喜欢
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多