2

私が使用している WCF サービスがあり、これまでのところうまくいっています。

しかし、大量のトラフィックを伴う実稼働システムでは、メモリが徐々に一貫して増減した後 (その間の時間が徐々に長くなり、差分が徐々に増加する)、メモリ消費量が増加傾向にあることに気付きました。

DAL Web サービスの使用方法が原因ではないかと考えています。

例えば:

    public static int GetUserTypeFromProfileID(int profileID)
    {
        try
        {
            memberServiceClient = new MemberServiceClient();                                // connect to the data service
            return memberServiceClient.GetUserTypeFromProfileID(profileID);                 // get the profileID associated with the sessionID
        }
        catch (Exception ex)
        {
            ErrorLogging.Instance.Fatal(ex);
            return 0;
        }
    }

usingステートメントを使用して、これを次のように変更した場合:

    public static int GetProfileIDFromSessionID(string sessionID)
    {
        try
        {
            using (memberServiceClient = new MemberServiceClient())                                // connect to the data service
            {
                return memberServiceClient.GetProfileIDFromSessionID(sessionID);                // get the profileID associated with the sessionID
            }

        }
        catch (Exception ex)
        {
            ErrorLogging.Instance.Fatal(ex);
            return 0;
        }
    }

usingセクション内でリターンを行うのは良い形ですか?

4

1 に答える 1

2

using ステートメントを使用すると、WCF に固有のものは何もないと思います。値を返す前に MemberServiceClient を破棄します。

ただし、WCF サービス クライアントの Dispose() メソッドは内部でClose()メソッドを呼び出すため、例外がスローされる可能性があります。したがって、Close() メソッドを直接呼び出す方が適切です。例外が発生した場合は、 Abort()メソッドも呼び出す必要があります。推奨される実装は次のとおりです。

var result;
try
{
    memberServiceClient = new MemberServiceClient();
    result = memberServiceClient.GetUserTypeFromProfileID(profileID);
    memberServiceClient.Close();
}
catch (FaultException e)
{
    //handle exception
    memberServiceClient.Abort();
}
catch (CommunicationException e)
{
    //handle exception
    memberServiceClient.Abort();
}
catch (TimeoutException e)
{
    //handle exception
    memberServiceClient.Abort();
}

注: これらの詳細を処理する単純な基本クラスを作成しました。NuGetにあります。

アップデート:

要求された WcfClientBase の例を次に示します。

public class MemberServiceManager : ServiceClientBase<MemberServiceClient>
{
    public int GetUserTypeFromProfileID(int profileID)
    {
        //makes a call to GetUserTypeFromProfileID operation, closes the channel and handles the exceptions
        //you may want to implement another base class for overriding exception handling methods
        //return value will be default of return type if any exceptions occur
        return PerformServiceOperation(item => item.GetUserTypeFromProfileID(profileID));
    }

    //or you can manually check if any exceptions occured with this overload
    public bool TryGetUserTypeFromProfileID(int profileID, out int userType)
    {
        return TryPerformServiceOperation(item => item.GetUserTypeFromProfileID(profileID), out userType);
    }


    //these exception handling methods should be overriden in another common subclass
    //they re-throw exceptions by default
    protected override void HandleCommunicationException(CommunicationException exception)
    {
        Console.WriteLine(exception.Message);
    }

    protected override void HandleFaultException(FaultException exception)
    {
        Console.WriteLine(exception.Message);
    }

    protected override void HandleTimeoutException(TimeoutException exception)
    {
        Console.WriteLine(exception.Message);
    }

}

GitHubでソース コードを確認することもできます。

于 2012-06-26T20:40:46.547 に答える