1

Silverlightクライアントから呼び出されるサービスをWCFで作成しています。IDispatchMessageInspectorを介して、障害が返されるたびにステータスコードを200に変更します。

ほぼ完璧に動作しますが、エラー500:NotFoundを返し続けることがあります。

ObjectContextの変更をコミットするために、別のIDispatchMessageInspectorを作成しました。ただし、これが失敗した場合、エラーハンドラは呼び出されません。

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.");
                }
            }
        }
4

2 に答える 2

0

コード500は内部エラーです。

何らかのエラーが発生しており、サーバー側でキャッチされていません。

コードでは、OptimisticConcurrencyExceptionのみをキャッチし、Exceptionもキャッチする必要があります。

于 2011-02-26T17:53:20.970 に答える
0

私はなんとかそれを機能させることができました。メッセージがすでに作成されているため、ステータスコード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);
                }
            }
        }
于 2011-02-28T11:09:37.003 に答える