Silverlight 在行为中抛出错误并将其返回给客户端

Silverlight 在行为中抛出错误并将其返回给客户端,silverlight,wcf,entity-framework,fault,wcf-behaviour,Silverlight,Wcf,Entity Framework,Fault,Wcf Behaviour,我正在用WCF编写一些服务,由Silverlight客户端调用。每次通过IDispatchMessageInspector返回故障时,我都会将状态代码更改为200 它工作得几乎完美,但有时它会不断返回错误500:NotFound 我刚刚编写了另一个IDispatchMessageInspector来提交ObjectContext中的更改。但如果失败,则不会调用错误处理程序 我认为当UnitOfWorkMessageInspector运行时,消息已经被设置为非故障响应。我怎样才能做到这两件事

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

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

我刚刚编写了另一个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.");
                }
            }
        }

代码500是内部错误

发生了一些错误,服务器端未捕获到该错误


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

我设法使它工作。我发现我的IDispatchMessageInspector无法从状态代码500切换到200,因为消息已经生成,然后我替换了消息

    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);
                }
            }
        }

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