I also noticed this behavior in netMsmqBinding, and as far as I know, it is not addressed by the service.
This is only a problem if you do not use transactional queues, because of which a failure in your service can cause the message in memory to be permanently deleted.
If you use transactional queues, even if the message was read from an incoming queue, it is actually still in the queue (but it becomes "invisible"). If you fail in your service, the message will be reordered at that time and then processed when you return.
If you cannot use transactional ordering, then the only way you can access this is to do it from the client, which means that you check if the message was sent before another call. This can be done using System.Messaging, or I assume you can bake it in the usual way.
source share