Я знаю, что это старый вопрос, но у меня была та же проблема, и в конце концов я нашел решение, которым я сейчас поделюсь с вами.
То, что вы на самом деле хотите сделать, - это предотвратить запуск операции службы на основании некоторого условия, обнаруженного в методе AfterReceiveRequest
. Для этого вам необходимо добавить IOperationInvoker
, который работает вместе с вашим сообщением IDispatchMessageInspector
class CustomMessageInspector : IDispatchMessageInspector
{
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
if (SuppressRequest(request, channel, instanceContext))
{
request.Properties.Add("SuppressMe", true);
}
}
// Other code omitted
}
class CustomInvoker : IOperationInvoker
{
public object Invoke(object instance, object[] inputs, out object[] outputs)
{
// If the message inspector added the "SuppressMe" property, then don't
// invoke anything and create an empty output.
if (OperationContext.Current.IncomingMessageProperties.ContainsKey("SuppressMe"))
{
bool suppress = (bool)OperationContext.Current.IncomingMessageProperties["SuppressMe"];
if (suppress)
{
outputs = null;
return null;
}
}
// Otherwise, go ahead and invoke the operation
return invoker.Invoke(instance, inputs, out outputs);
}
}
Затем вы можете подключить этого инспектора сообщений и этого вызывающего к вашей операции, используя обычные методы (с помощью атрибута или поведения конечной точки, указанного в файле конфигурации).