2011-02-25 53 views
1

我正在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."); 
       } 
      } 
     } 

回答

0

我设法使它工作。我想我的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); 
       } 
      } 
     } 
+0

想知道这是否是一种很好的做法,我替换回复的方式... – 2011-03-02 19:51:16

0

代码500是内部错误。

发生了一些错误,并未在服务器端捕获。

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

+0

我很喜欢通过IDispatchMessageInspector捕获所有的异常,并在发生故障时将状态码更改为200。当异常在另一个IDispatchMessageInspector中抛出时,它不起作用。 – 2011-02-27 15:13:27

+0

如果故障只发生在BeforeSendReply中,如何将状态码从500更改为200? – 2011-02-27 15:15:30

+0

您需要检查所有代码,并检查是否存在任何未捕获的异常,这些异常也位于IDispatchMessageInspector和catch块中。 – 2011-02-27 15:24:17

相关问题