1

主题说明了一切:我正在创建一个安全且通用的包装器来透明地访问 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[]。

你有什么建议来改进它,或者有什么其他的方法可以达到同样的效果吗?

谢谢

4

1 回答 1

2

我可以在这里看到一个直接的问题。您正在使用反射,它的性能远不如直接调用。

对我来说,不走这条路就足够了。

于 2010-09-10T12:15:13.540 回答