从一点点阅读,我的理解是,检测客户端已连接到我的服务的唯一方法是编写我自己的代码。 我正在使用Singleton服务。我希望每次客户端连接到我的服务时都会显示一条消息,即客户端x与ip xxx已连接。没有生成的内置事件?我是对的吗?
答案 0 :(得分:0)
不,我认为WCF对您的要求没有任何支持。
也不确定你想要实现的目标。您的服务类(在您的情况下,只是一个实例)真的没有任何业务发布消息(在屏幕上,我猜) - 这真的不是它的工作。服务类用于处理请求并提供响应 - 仅此而已。
ServiceHost
类可能更适合此功能 - 但同样,它的工作实际上是托管服务,启动WCF运行时等等 - 而且它实际上也不是UI组件。
你可能做的就是这个
netNamedPipe
绑定,这非常适合应用程序内部消息传递)通过这种方式,您可以干净地分离您的真实服务和它的工作(提供该服务)和您想要执行的管理UI工作,并构建一个完全分离的系统。
答案 1 :(得分:0)
我实际上实现了自己的connect
,disconnect
和ping
服务方法,一旦创建了频道,我就会从我的客户端手动调用这些方法。通过将它们用作我所有ServiceContract
接口定义(当然还有它们的实现)中的一种标题部分,它们形成了一个临时的“基本服务定义”,只需要一些cut-n-paste。
connect
和disconnect
的基于字符串的参数将用于将客户端信息发送到服务器,并将服务器信息和(可能是唯一的连接ID)返回给客户端。此外,一组定时参考点也可以进入。
请注意SessionMode
是如何需要的,并且为每个方法明确指定了单独的OperationContract
属性IsInitiating
和IsTerminating
,最终结果是我称之为“单个” -session“服务,因为它定义connect
和disconnect
作为唯一的会话书挡。
另请注意,ping
命令将用作基于计时器的“心跳”调用的目标,该调用测试服务连接状态并在没有单个配置的情况下使所有连接超时失败档案: - )
另请注意,我还没有确定我的故障处理结构,这可能会很好地添加一个或多个方法和/或需要其他类型的更改。
[ServiceContract( SessionMode = SessionMode.Required )]
public interface IRePropDalSvr {
[OperationContract( IsInitiating=true, IsTerminating=false )]
string connect (string pClientInfo);
[OperationContract( IsInitiating=false, IsTerminating=true, IsOneWay=true )]
void disconnect (string pClientInfo);
// ------------------------------------------------------------------------------------------
[OperationContract( IsInitiating=false, IsTerminating=false )]
string ping (string pInp);
// ------------------------------------------------------------------------------------------
// REST OF ServiceContract DEFINITION GOES HERE
有一点需要注意:虽然我目前正在使用此代码及其在我的服务类中的实现,但我还没有验证代码。