【问题标题】:Throwing a fault inside a behavior and returning it to client在行为中抛出错误并将其返回给客户端
【发布时间】:2011-02-25 20:33:21
【问题描述】:

我正在 WCF 中编写一些服务,以供 Silverlight 客户端调用。每次要通过 IDispatchMessageInspector 返回故障时,我都会将状态代码更改为 200。

它工作得几乎完美,但有时它会不断返回错误 500:未找到。

我刚刚编写了另一个 IDispatchMessageInspector 来提交 ObjectContext 中的更改。但是当这失败时,错误处理程序不会被调用。

我认为在 UnitOfWorkMessageInspector 运行时,该消息已被设置为非故障响应。我怎样才能做到这两点?

    public class UnitOfWorkMessageInspector : IDispatchMessageInspector
    {
        public void BeforeSendReply(ref Message reply, object correlationState)
        {
            if (!reply.IsFault)
            {
                try
                {
                    UnitOfWorkBase.Commit();
                }
                catch (OptimisticConcurrencyException)
                {
                    throw new FaultException("It was changed by another user. Try again.");
                }
            }
        }

【问题讨论】:

    标签: silverlight wcf entity-framework fault wcf-behaviour


    【解决方案1】:

    代码 500 是内部错误。

    发生了一些错误,它没有在服务器端捕获。

    在您的代码中,您只需捕获 OptimisticConcurrencyException,您还需要捕获 Exception。

    【讨论】:

    • 我有点通过 IDispatchMessageInspector 捕获所有异常,并在出现故障时将状态代码更改为 200。当在另一个 IDispatchMessageInspector 中引发异常时,它不起作用。
    • 如果故障只发生在 BeforeSendReply 中,如何将状态码从 500 更改为 200?
    • 您需要检查所有代码并检查是否有任何未捕获的异常,也在 IDispatchMessageInspector 和 catch 块中。
    【解决方案2】:

    我设法让它工作。我发现用于从状态码 500 切换到 200 的 IDispatchMessageInspector 不起作用,因为消息已经构建,然后我替换了消息。

        public class UnitOfWorkMessageInspector : IDispatchMessageInspector
        {
            public void BeforeSendReply(ref Message reply, object correlationState)
            {
                if (!reply.IsFault)
                {
                    try
                    {
                        UnitOfWorkBase.Commit();
                    }
                    catch (OptimisticConcurrencyException)
                    {
                        FaultException fe = new FaultException("It was changed by another user. Try again.");
                        reply = Message.CreateMessage(reply.Version, fe.CreateMessageFault(), fe.Action);
                    }
                }
            }
    

    【讨论】:

      猜你喜欢
      • 2016-04-09
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 2020-11-22
      • 2011-12-16
      • 1970-01-01
      • 2017-04-02
      • 2021-09-23
      相关资源
      最近更新 更多