主题说明了一切:我正在创建一个安全且通用的包装器来透明地访问 WCF 服务。
一点背景:
我所做的是我在服务器和客户端上都创建了类似的业务类定义。服务器端包含实际逻辑,而客户端仅包含方法定义。此外,客户端类派生自实现 Call 方法的 SecureFactory。每个派生类的每个方法的主体只包含对 Call 方法的调用。这个 Call 方法负责调用服务器服务,传递诸如业务类的类型以及调用它的哪个方法来执行请求的操作。设计此方法是为了通过将安全信息的传递限制在 SecureFactory 和服务器服务之间来简化安全检查。您最了解的还有许多其他好处。
现在问题来了:我不知道如何将对象(尤其是对象数组)从服务器返回到调用方法?服务器可能会返回单个业务对象(应用了 DataContract)以及此类对象的列表。由于它是一种通用方法,因此我只有 Object 用作返回类型。以下是调用方法
公共对象调用(参数对象 [] 参数)
{
var mb = (new StackFrame(1).GetMethod());
使用 (Proxy.ServerClient 服务器 = new Security.BO.Proxy.ServerClient())
{
尝试
{
if (((MethodInfo)mb).ReturnType.IsGenericType)
{
var response = server.InvokeForList(SecurityManager.Current.SID, SecurityManager.Current.Token, mb.DeclaringType.ToString(), mb.Name, 参数);
返回 response.Result.ToList();
}
别的
{
var response = server.Invoke(SecurityManager.Current.SID, SecurityManager.Current.Token, mb.DeclaringType.ToString(), mb.Name, 参数);
返回响应。结果;
}
}
捕捉(例外前)
{
System.Diagnostics.Debugger.Break();
}
}
返回空值;
}
服务器方法:
public CollectionResponse InvokeForList(string SID, string token, string type, string method, object[] 参数)
{
// 这里验证
var t = assemblyBO.GetType(type, true);
对象 BO = Activator.CreateInstance(t);
var mi = t.GetMethod(方法);
如果(mi == null)
throw new MethodNotImplementedException("方法 " + 方法 + " 无法在类型 " + t.ToString()) 上找到;
对象 res = mi.Invoke(BO, 参数);
// 将列表转换为 t[]
对象列表 = res.GetType().GetMethod("ToArray").Invoke(res, new object[0]);
// 这里出错!无法将 t[] 转换为 object[]
返回新的 CollectionResponse((object[])list);
}
另一个方法 Invoke(...) 与 Accept 类似,它返回 Response 对象而不是 CollectionResponse。
这是 CollectionResponse 类:(响应类似:只需要一个对象)
[数据合约]
公共类 CollectionResponse
{
[数据成员]
私有对象[] _结果;
公共对象[] 结果
{
得到
{
返回_结果;
}
}
公共集合响应(对象 [] 结果)
{
this._result = 结果;
}
}
最初,我想对列表和单例都只有一个 Invoke - 但因“连接意外关闭”而失败。我仍然无法实现 - 如何将 T[] 转换为 object[]。
你有什么建议来改进它,或者有什么其他的方法可以达到同样的效果吗?
谢谢