停止在wcf请求中执行

时间:2009-05-21 13:57:04

标签: .net wcf

我正在尝试在AfterReceiveRequest消息检查器方法中回复WCF请求(实现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 :(得分:0)

这可能是预期的行为。我认为你无法解决这个问题。

在将消息传递给方法之前,使用消息检查器进行除观察或调整之外的任何操作都可能是一个坏主意。看起来你想要做的更适合你的操作的实现。您应该看到一个消息检查器,可以在将消息传递给调度程序之前查看消息或进行调整。

答案 1 :(得分:-1)

我知道这是一个老问题,但我遇到了同样的问题并最终找到了解决方案,我现在将与您分享。

您实际想要做的是阻止根据您在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);
    }
}

然后,您可以使用常规方法(通过配置文件中指定的属性或端点行为)将此消息检查器和此调用程序与您的操作连接起来。