1

WCF サービスから FaultException が返された場合、チャネルを閉じるのではなく、チャネルを中止する必要があります。私のクライアントとサービスはどちらもこのアプローチで問題なく動作しますが、サービスに IErrorHandler を実装して例外をログに記録した後、クライアントで Abort を呼び出すとサービスがログに記録されることがわかります。

System.ServiceModel.CommunicationException: ソケット接続が中止されました...

この情報でサービス ログを汚したくないので、サービス関連のエラーのみをログに記録したいと考えています。CommunicationExceptions のログ記録を停止できることは明らかですが、私のサービスは他のサービスの WCF クライアントでもあり、これらのサービスによって発生した CommunicationExceptions はログに記録する必要があります。

これをやめさせるにはどうすればよいですか?

4

2 に答える 2

1

他の誰もその質問に答えていないので (Tomas の答えは関係ありませんでした)、私はこの分野の専門家数人に尋ねました。残念ながら、これを止める良い方法はありません。彼らが思いついた最善の方法は、IErrorHandler にロジックを追加して、「ソケット接続が中止されました」というメッセージで CommunicationExcepions をログに記録しないことでした。あまりエレガントではありませんが、機能します。

于 2011-01-20T13:50:43.997 に答える
0

問題は、dispose を呼び出すときに例外が発生した場合に、潜在的な例外をカバーする例外が発生することです。このようなシナリオに対処するためのラッパーを作成しました。これについては、私のブログで読むことができます: http://blog.tomasjansson.com/2010/12/disposible-wcf-client-wrapper/

dispose メソッドが例外をスローした場合にシナリオを処理するチャネルのラッパーを用意するという考え方です。

私のラッパーを使用する方法の小さな例:

public class ClientWrapperUsage : IYourInternalInterface
{
    public IList<SomeEntity> GetEntitiesForUser(int userId)
    {
        using(var clientWrapper = new ServiceClientWrapper<ServiceType>())
        {
            var response = clientWrapper.Channel.GetEntitiesForUser();
            var entities = response.YourListOfEntities.TranslateToInternal();
            return entities;
        }
    }
}

ここでは、サービスによって返されるエンティティを含むリストの拡張メソッドが存在すると仮定し、そのメソッドを使用してそれを内部エンティティに変換します。これは 100% テスト可能です。少なくとも私はそう思います:)。IYourInternalInterfaceサービスを偽造したくない場合は、どこでもインターフェイスをモックするだけです。

于 2011-01-10T15:58:18.647 に答える