gpt4 book ai didi

c# - 使用 WCF 服务时,从 using 语句中返回是否是一种好的形式?

转载 作者:太空宇宙 更新时间:2023-11-03 11:20:25 25 4
gpt4 key购买 nike

我有一个正在使用的 WCF 服务,并且到目前为止一直运行良好。

然而,在我们流量很大的生产系统上,我注意到在内存逐渐持续上升和下降之后(时间逐渐拉长,增量逐渐增加),内存消耗呈上升趋势。

我想知道这是否是由于我使用 DAL 网络服务的方式所致:

例如:

    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 部分执行返回是好的形式吗?

最佳答案

我相信 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 上的源代码

关于c# - 使用 WCF 服务时,从 using 语句中返回是否是一种好的形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11215530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com