主题说明了一切:我正在创建一个安全且通用的包装器来透明地访问 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[]。
你有什么建议来改进它,或者有什么其他的方法可以达到同样的效果吗?
谢谢