开发者

Detect when client connected to wcf service

From a little bit of reading around, it is my understanding that the only way to detect that a client has connected to my service is through writing my own code. I am using a Singleton service. I w开发者_高级运维ould like to display a message every time a client connects to my service that client x with ip xxx has connected. There is no built-in event that is generated? Am I correct?


No, I don't think there's any support in WCF for your requirement.

Not sure what you want to achieve with this, either. Your service class (in your case, just a single instance) really doesn't have any business putting up messages (on screen, I presume) - that really not it's job. The service class is used to handle a request and deliver a response - nothing more.

The ServiceHost class might be more of a candidate for this feature - but again, it's job really is to host the service, spin up the WCF runtime etc. - and it's really not a UI component, either.

What you could possibly do is this

  • have an Admin UI (a Winforms, console, or WPF app) running on your server alongside your service, providing an admin service to call
  • define a fast connection between the two services (using e.g. netNamedPipe binding which is perfect for intra-application messaging)
  • when your "real" service gets a call, the first thing it does is send out a message to the admin UI which can then pick up that message and handle it

That way, you could cleanly separate your real service and it's job (to provide that service) and the Admin UI stuff you want to do and build a cleanly separated system.


I have actually implemented my own connect, disconnect and ping service methods which I manually call from my client once the channel has been created. By using them as a kind of header section in all of my ServiceContract interface definitions (and their implementations, of course), they form an makeshift "base service definition" that only requires a bit of cut-n-paste.

The string-based parameters of connect and disconnect will be used to send client info to the server and return server info and (perhaps a unique connection id) to the client. In addition a set of timing reference points may make its way in also.

Note how SessionMode is required and the individual OperationContract properties IsInitiating and IsTerminating are explicitly specified for each method, the end result being what I would call a "single-session" service in that it defines connect and disconnect as the sole session bookends.

Note also that the ping command will be used as the target of a timer-based "heartbeat" call that tests the service connection state and defeats ALL connection timeouts without a single config file :-)

Note also that I haven't determined my fault-handling structure yet which may very well add a method or more and/or require other kinds of changes.

   [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

One caveat: while I am currently using this code and its implemention in my service classes, I have not verified the code yet.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜