在另一个进程中处理 WCF 事件

2024-03-12

我有一个不可序列化的对象,我想从单独的进程访问它。我环顾四周,似乎唯一可行的选择是使用 WCF,但我不确定如何执行此操作,因为我是 WCF 新手。如果我创建一个 WCF 服务,如何将 WinForm“挂钩”到 WCF 服务中的各种事件中?例如,用户直接与 WCF 服务通信,我希望我的 WinForm 客户端收到通知。我如何才能知道用户何时使用 WCF 服务执行了某些操作并让 WinForm 客户端接收到该操作?


实现您想要的目标的一种方法是在您的服务上实现回调合约。然后,您的 win-forms 应用程序将能够“订阅”服务上触发的事件(例如对对象的修改)。

为此,您需要使用回调合约实现服务合约:

[ServiceContract]
public interface IMyService_Callback
{
    [OperationContract(IsOneWay = true)]
    void NotifyClients(string message);
}

[ServiceContract(CallbackContract = typeof(IMyService_Callback))]
public interface IMyService
{
    [OperationContract]
    bool Subscribe();
}

然后您实施您的服务:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant)]
public class MyService : IMyService
{
    private List<IMyService_Callback> callbacks;

    public MyService()
    {
        this.callbacks = new List<IMyService_Callback>();
    }

    private void CallClients(string message)
    {
        callbacks.ForEach(callback => callback.NotifyClients(message));
    }

    public bool Subscribe()
    {
        var callback = OperationContext.Current.GetCallbackChannel<IMyService_Callback>();

        if (!this.callbacks.Contains(callback))
        {
            this.callbacks.Add(callback);
        }

        // send a message back to the client
        CallClients("Added a new callback");

        return true;
    }
}

在你的winforms客户端中你只需要实现回调方法:

[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, UseSynchronizationContext = false)]
public partial class ServiceClient : Form, IMyService_Callback
{
    // Sync context for enabling callbacks
    SynchronizationContext uiSyncContext;

    public ServiceClient()
    {
        InitializeComponent(); //etc.

        uiSyncContext = SynchronizationContext.Current;

        // Create proxy and subscribe to receive callbacks
        var factory = new DuplexChannelFactory<IMyService>(typeof(ServiceClient), "NetTcpBinding_IMyService");
        var proxy = factory.CreateChannel(new InstanceContext(this));
        proxy.Subscribe();
    }

    // Implement callback method
    public void NotifyClients(string message)
    {
        // Tell form thread to update the message text field
        SendOrPostCallback callback = state => this.Log(message);

        uiSyncContext.Post(callback, "Callback");
    }

    // Just updates a form text field
    public void Log(string message)
    {
        this.txtLog.Text += Environment.NewLine + message;
    }
}    

服务配置:

<system.serviceModel>
  <services>
    <service name="TestService.MyService" behaviorConfiguration="Normal">
      <endpoint 
        address="net.tcp://localhost:8000/MyService" 
        contract="TestService.IMyService" 
        binding="netTcpBinding" />
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="Normal" >
        <serviceDebug includeExceptionDetailInFaults="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

客户端配置

<system.serviceModel>
  <client>
    <endpoint address="net.tcp://localhost:8000/MyService" 
              binding="netTcpBinding"
              contract="TestService.IMyService"
              name="NetTcpBinding_IMyService">
    </endpoint>
  </client>
</system.serviceModel>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在另一个进程中处理 WCF 事件 的相关文章

  • getline 之后返回到文件开头

    所以我已经从文件中读取了所有行 while getline ifile line logic 其中 ifile 是 ifstream line 是字符串 我的问题是我现在想再次使用 getline 并且似乎无法返回到文件的开头 因为运行 c
  • 更新 Azure Blob 上的 LastModified

    我正在移植代码以使用 C 中的 Azure 存储 SDK 传统上 我称其为更新修改文件的上次写入 修改时间 File SetLastWriteTimeUtc fileName lastWriteTimeUtc 要更新 blob 的上次修改时
  • Boost MPI 在监听列表时不会释放资源?

    这是一个后续问题如何释放 boost mpi request https stackoverflow com questions 44078901 how do i free a boostmpirequest 我在监听列表而不是单个项目时
  • 如何在VB.NET中画一条线

    我正在尝试用 VB NET 画一条简单的线 我的代码如下 但是当我运行代码时 只显示表单 没有线 我在这里做错了什么 Public Class Form1 Dim pen As System Drawing Graphics Private
  • 如何从不同的线程访问控件?

    如何从创建控件的线程以外的线程访问控件 避免跨线程错误 这是我的示例代码 private void Form1 Load object sender EventArgs e Thread t new Thread foo t Start p
  • 选择initializer_list迭代器定义

    Why std initializer list
  • 为什么 BinaryFormatter 可以序列化 Action<> 但 Json.net 不能

    尝试序列化 反序列化 Action 尝试我的 1天真 JsonConvert SerializeObject myAction JsonConvert Deserialize
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 查找方法不适用于 EF6.1 模拟

    我已经使用这些 msdn 指南设置了模拟 使用模拟框架进行测试 EF6 及以上 http msdn microsoft com en us data dn314429 var bsAc db BusAcnts FirstOrDefault
  • 使用 OleDbCommand / OleDbDataAdapter 读取 CSV 文件

    我不明白为什么 但是当我使用 OleDbDataAdapter 或 OleDbCommand 读取 CSV 文件时 在这两种情况下 生成的数据结构良好 它识别文件头中的列 但行数据都是空字符串 我之前已经成功进行过多次 CSV 处理 因此我
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 从具有相同属性的另一个对象创建对象

    我有一个 C 对象 可以说有 20 个属性 它是数据契约的一部分 我还有另一个具有类似属性的业务实体 我想从响应对象中填充该实体 除了将一个对象的每个属性分配给另一个对象的相应属性之外 还有其他方法可以做到这一点吗 是的 看看自动映射器 h
  • 调试错误:在 vc++ 项目中使用 COM 时发生 所需的运行时?

    我为我的工作创建了一个 COM 组件 我也注册了该组件 在我的系统上 我有两个虚拟机工作站 在我的第一个工作站中 它运行良好 在我的第二个工作站中 它显示一个包含消息的错误框该程序需要一段时间并以不寻常的方式关闭 请联系应用程序管理员 我认
  • 如果仅使用第一个元素,是否必须为整个结构分配内存?

    我有一个结构 其中第一个元素被测试 并且根据其值 结构的其余部分将被读取或不会被读取 在第一个元素的值指示结构的其余部分不会被读取的情况下 我是否必须为整个结构或仅第一个元素分配足够的内存 struct element int x int
  • 如何重用具有稍微不同的 ProcessStartInfo 实例的 Process 实例?

    我有以下开始的代码robocopy https technet microsoft com en us library cc733145 aspx as a Process 我还需要进行数据库查询以确定每次需要复制哪些目录robocopy被
  • 基础设施 - 同步和异步接口和实现? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在实现库 基础设施时 并且该 API 的用户希望同步和异步使用代码 我读到混合同步和异步并不是一个好主意 例如 同步实现包括等待异步实现 显然
  • 使用任务的经典永无止境的线程循环?

    给出了一个非常常见的线程场景 宣言 private Thread thread private bool isRunning false Start thread new Thread gt NeverEndingProc thread S
  • 检查一个数是否是完全平方数?

    我认为以下代码存在精度问题 bool isPerfectSquare long long n long long squareRootN long long sqrt n 0 5 return squareRootN squareRootN
  • 如何通过API退出Win32应用程序?

    我有一个使用 Win32 API 编写的 C Win32 应用程序 我希望强制它在其中一个函数中退出 有没有类似的东西Exit or Destroy or Abort 类似的东西会终止它吗 哎呀呀呀呀呀呀 不要做任何这些事情 exit 和
  • 如何根据当前日期时间发现财政年度?

    我需要基于当前或今天的日期时间的财政年度 假设我们认为今天的日期是10 April 2011 那么我需要输出为Financial Year 2012在某些情况下 我需要以短格式显示相同的输出FY12 我想以两种方式显示 在我们的要求中 考虑

随机推荐

  • 在 Ionic 2 应用程序中,模板在构造函数之前首先加载

    我正在开发 ionic 2 应用程序 我正在尝试调用组件中的服务并尝试在模板中访问它 但我面临的问题是模板首先加载 然后组件中的承诺输出成功 因此 如果我尝试访问任何 req obj 值 我会从模板中收到未定义的错误 如何确保承诺首先得到解
  • 渐进式 Web 应用程序:离线缓存在 Android 上不起作用,但在 Chrome 开发工具上起作用

    我有一个简单的 PWA 可以在网上正常运行 我还在 Chrome 开发工具中测试了离线行为 并且 Service Worker 正在完美地完成其工作 但是 当我从 Android 手机运行该应用程序时 它无法离线工作 因为离线时缓存存储不再
  • 如何更改 .npz 文件中的值?

    我想改变一个值npz file The npz文件包含几个npy的 我想要除了一个以外的所有 run param 保持不变 我想保存原始文件 这是我的工作代码 DATA DIR C Projects Test data ass file n
  • 从 shell 脚本生成交互式 telnet 会话

    我正在尝试编写一个脚本来允许我登录到控制台服务器的 48 个端口 以便我可以快速确定哪些设备连接到每条串行线路 本质上 我希望能够有一个脚本 给定主机 端口列表 远程登录到列表中的第一个设备 并使我处于交互模式 以便我可以登录并确认设备 然
  • MAC M1 安装“sharp”模块时出错

    Running npm run dev gatsby develop 在 MacBook Pro M1 芯片上退出 Error Something went wrong installing the sharp module Running
  • JSON ValueError:期望属性名称:第 1 行第 2 列(字符 1)

    我在使用 json loads 转换为 dict 对象时遇到问题 我无法弄清楚我做错了什么 我运行这个的确切错误是 ValueError Expecting property name line 1 column 2 char 1 这是我的
  • 在 onStopTrackingTouch 中获取进度,而不是在搜索栏中的 onProgressChanged 中获取进度

    我是 Android 开发新手 我用onProgressChanged获取当前进度 因为进度是函数的参数 but 我只想获得进度的最终值当用户释放seekbar不是立即值 提前致谢 The onStopTrackTouch方法定义在OnSe
  • C 中带有函数的 realloc 结构

    我的 C 程序崩溃了 我太新了 无法弄清楚 到目前为止 它非常简单 我想代码足以找出问题所在 我只是想逐行读取文件 一旦内存不足 我会将结构的内存加倍 如果这还不够 我会提供您需要的其他信息 非常感谢您的帮助 因为我已经被困了几个小时了 J
  • 如何在 MySQL 中获得精确的小数值而不进行四舍五入

    我有下面这个 SQL 脚本 select round 72 396 2 我期望的结果是 72 39 我不想四舍五入这个数字 如果我使用select round 72 396 2 我得到的结果是 72 40如何在不使用 Mysql 舍入的情况
  • 通过 putty 连接到 play-with-docker 实例

    我正在尝试通过 putty 连接到 docker 实例https labs play with docker com https labs play with docker com 我试过了 ip172 18 0 21 email prot
  • 从 Play JSON API 获取更好的错误消息

    Play JSON API 生成的错误消息类型示例 scala gt import play api libs json import play api libs json scala gt Json obj k gt Json obj m
  • 在哪里以及如何使用嵌套类? [复制]

    这个问题在这里已经有答案了 我在想 如果一个类只能在另一个类中实例化 那么在该类中嵌套使用它是正确的 我认为这将有助于我们良好的设计 当我查看我的项目时 我几乎从未见过这样的嵌套结构 但是如果我尝试嵌套类 那么这次我的脑海中会出现另一个问题
  • Java检查Checkbox是否被选中

    I use CheckboxGroup cg new CheckboxGroup Checkbox c1 new Checkbox A false cg Checkbox c2 new Checkbox B false cg Checkbo
  • 如何使用 Angularjs 以 PHP 方式提交表单?

    我发现AngularJS 有点阻止了原始表单的提交方式 https stackoverflow com questions 23813413 how to programmatically submit a form with angula
  • 如何在 ui-router 解析器中重定向?

    我正在尝试在 ui router 解析器内部进行重定向 并想知道是否有办法在路由器解析器中重新路由 目前这并不像人们想象的那样有效 resolver auth state if auth isLoggedIn state go noLogg
  • VB 6:一个窗体上可以有多少个控件?

    我知道命名控件的限制是 254 超出这个限制就必须使用控件数组 但看来我们也达到了数组的极限 知道绝对极限是多少吗 没有absolute限制 如果您在表单上放置了足够多的控件 最终将耗尽内存 我制作了一个测试应用程序 将命令按钮加载到控制数
  • 如何使用“cmp”比较两个二进制文件并找到它们不同的所有字节偏移量?

    我希望获得有关 Bash 脚本循环的帮助 该循环将显示两个二进制文件之间的所有差异 仅使用 cmp file1 file2 它只显示我想使用 cmp 的第一个更改 因为它给出了每个更改所在位置的偏移量和行号 但如果您认为有更好的命令 我愿意
  • 在 Angular 2 中解析来自 Hal+JSON 对象的信息

    我有一个 spring data rest 存储库 它生成一个 hal json 对象 我希望我的 Angular 2 前端能够接收和显示该对象 Hal Json 对象 embedded users name Bob links self
  • Cypress:如何等待所有请求完成

    我正在使用 cypress 来测试我们的 Web 应用程序 在某些页面中 有不同的端点请求被执行多次 例如GET A GET B GET A 为了等待所有请求完成并保证页面已完全加载 赛普拉斯的最佳实践是什么 我不想用很多cy wait 命
  • 在另一个进程中处理 WCF 事件

    我有一个不可序列化的对象 我想从单独的进程访问它 我环顾四周 似乎唯一可行的选择是使用 WCF 但我不确定如何执行此操作 因为我是 WCF 新手 如果我创建一个 WCF 服务 如何将 WinForm 挂钩 到 WCF 服务中的各种事件中 例