gpt4 book ai didi

c# - 调用 WebServices 的通用方法

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

我正在尝试创建一个方法来控制从我的前端到后端的调用。为此,我制作了一个通用方法(因为我有很多 SoapClient)

public static TRet CallWebServiceAndReturn<TRet, TClient>(ClientBase<TClient> client, string methodName, object[] parameters, bool cacheThis) 
where TClient : ClientBase<TClient>
{
//seta retorno para null como default
object ret = null;

//recupera Type da classe
Type clientType = typeof(TClient);

//recupera método da classe para ser executado
MethodInfo method = clientType.GetMethod(methodName);

//cache
if (cacheThis)
{
string cacheKey = CacheManager.GenerateCacheKey(clientType.Name, method.Name, parameters);
if (CacheManager.TryGetFromCacheWS(cacheKey, out ret))
return (TRet)ret;
}

try
{
//tenta executar o método
ret = method.Invoke(client, parameters);
}
catch (Exception)
{
//em caso de erro, fecha conexões
if (client.State == CommunicationState.Faulted)
client.Abort();
else
client.Close();
}

//se cache está habilitado, faaz o cache do resultado da chamada
if (cacheThis)
{
string cacheKey = CacheManager.GenerateCacheKey(clientType.Name, method.Name, parameters);
CacheManager.AddToCacheWS(cacheKey, ret);
}

//converte retorno em RET e retorna
return (TRet)ret;
}

我真的不知道通用 TClient 应该是什么样子。当我从 Visual Studio 检查自动生成的客户端时,它扩展了一个 ClientBase,因此,我得出结论,我只需要将它放在“where”子句中:

 where TClient : ClientBase<TClient>

自动生成的 SoapClient 实现:

 public partial class MenuSoapClient : System.ServiceModel.ClientBase<frontend.WSMenu.MenuSoap>, frontend.WSMenu.MenuSoap {

此时,我没有任何错误,但随后,我尝试编写一些代码:

 public static CategoryType[] GetSuperiorMenu(int idUser, int idRegion, int idRole, int idLanguage)
{
object[] parameters = new object[] { idUser, idRegion, idRole, idLanguage };

CategoryType[] ret = null;

MenuSoapClient menuClient = new MenuSoapClient();
ret = WSClientService.CallWebServiceAndReturn<CategoryType[], MenuSoapClient>(menuClient, "GetSuperiorMenu", parameters, true);
//rest of my code

在最后一行,Visual Studio 在“menuClient”的第一个参数上给我一个错误:

无法从 frontend.WSMenu.MenuSoapClient 转换为 System.ServiceModel.ClientBase

我做错了什么?

提前致谢。

最佳答案

好的,通过一些搜索,我发现了这个: C# generic ClientBase with interface confusion

我的代码有一些错误,所以,我改成这样:

 public static TRet CallWebServiceAndReturn<TInterface, TClient, TRet>(TClient client, string methodName, object[] parameters, bool cacheThis)
where TInterface : class
where TClient : ClientBase<TInterface>, TInterface
{
//......
}

用这个调用:

 MenuSoapClient menuClient = new MenuSoapClient();
ret = WSClientService.CallWebServiceAndReturn<MenuSoap, MenuSoapClient, CategoryType[]>(menuClient, "GetSuperiorMenu", parameters,
true);

关于c# - 调用 WebServices 的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43869491/

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