Queued Services

  1. On the client, always verify that the queue (and a dead-letter queue, when applicable) is available before calling the queued service. Use QueuedServiceHelper.VerifyQueues() for this purpose.

  2. Always verify that the queue is available when hosting a queued service (this is done automatically by ServiceHost<T>).

  3. Except in isolated scenarios, avoid designing the same service to work both queued and non-queued.

  4. The service should participate in the playback transaction.

  5. When participating in the playback transaction, avoid lengthy processing in the queued service.

  6. Avoid sessionful queued services.

  7. When using a singleton queued service, use a volatile resource manager to manage the singleton state.

  8. When using a per-call queued service, explicitly configure the contract and the service to be per-call and sessionless:

    [ServiceContract(SessionMode = SessionMode.NotAllowed)]
    interface IMyContract
    {...}
    
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    class MyService : IMyContract
    {...}
  9. Always explicitly set contracts on a queued singleton to disallow sessions:

    [ServiceContract(SessionMode = SessionMode.NotAllowed)]
    interface IMyContract
    {...}
    
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    class MyService : IMyContract
    {...}
  10. The client should call a queued service inside a transaction.

  11. On the client side, do not store a queued service proxy in a member variable.

  12. Avoid relatively short values of TimeToLive, as they negate the justification for a ...

Get Programming WCF Services, 3rd Edition now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.