остановить выполнение в запросе wcf - PullRequest
0 голосов
/ 21 мая 2009

Я пытаюсь ответить на запрос WCF в AfterReceiveRequest методе инспектора сообщений (реализует IDispatchMessageInspector)

  XmlReader xmlReader = XmlReader.Create(
    new StringReader(string.Format(@"<{0}Response xmlns='{1}' />",methodName,namespace)));

  Message replyMsg = Message.CreateMessage(request.Version, request.Headers.Action, xmlReader);
  OperationContext.Current.RequestContext.Reply(replyMsg);

клиент получает ответ сразу по этому пути.

Остальная часть задачи - прервать выполнение на сервере и завершиться без ошибок.

request.Close () прерывает выполнение, но если вы посмотрите на сообщение в BeforeSendReply, это создаст ошибку.

ну, это не подходит для нас, и мы ищем удобное завершение. есть ли вообще это сделать ??

Ответы [ 2 ]

0 голосов
/ 25 сентября 2013

Я знаю, что это старый вопрос, но у меня была та же проблема, и в конце концов я нашел решение, которым я сейчас поделюсь с вами.

То, что вы на самом деле хотите сделать, - это предотвратить запуск операции службы на основании некоторого условия, обнаруженного в методе 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);
    }
}

Затем вы можете подключить этого инспектора сообщений и этого вызывающего к вашей операции, используя обычные методы (с помощью атрибута или поведения конечной точки, указанного в файле конфигурации).

0 голосов
/ 21 мая 2009

Это, вероятно, ожидаемое поведение. Я не думаю, что вы сможете обойти это.

Использование инспектора сообщений для чего-либо, кроме наблюдения или адаптации, перед передачей сообщения методу, вероятно, плохая идея. Кажется, что то, что вы пытаетесь сделать, больше подходит для реализации вашей операции. Вы должны увидеть инспектора сообщений как возможность увидеть сообщение или настроить его, прежде чем оно будет передано диспетчеру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...