不写代理类也不用vs.net生成的代理类 执行时WCF动态调用(不需用到WCF接口)
在国外网站上看到代码string serviceWsdlUri = "http://127.0.0.1:6061/Service1.svc?wsdl";
            
            DynamicProxyFactory factory = new DynamicProxyFactory(serviceWsdlUri);
            
            int count = 0;            List<object> myEndpoints = new List<object>();            foreach (ServiceEndpoint endpoint in factory.Endpoints)
            {
                Console.WriteLine("Service Endpoint[{0}]", count);
                Console.WriteLine("\tAddress = " + endpoint.Address);
                Console.WriteLine("\tContract = " + endpoint.Contract.Name);
                Console.WriteLine("\tBinding = " + endpoint.Binding.Name);
                myEndpoints.Add(endpoint.Contract.Name);
            }
            foreach (string endpoint in myEndpoints)
            {
                DynamicProxy dp = factory.CreateProxy(endpoint);                OperationDescriptionCollection operations = factory.GetEndpoint(endpoint).Contract.Operations;                Type proxyType = dp.ProxyType;
                MethodInfo[] mi = proxyType.GetMethods(BindingFlags.Public | BindingFlags.Instance);                for (int i = 0; i < mi.Length; i++)
                {
                    string name = mi[i].Name;
                    if (operations.FirstOrDefault(x => x.Name == name) != null)
                    {
                        string returnType = mi[i].ReturnType.ToString();
                        Console.Write("Func: " + returnType + " " + name + "(");
                        ParameterInfo[] pi = mi[i].GetParameters();
                        for (int j = 0; j < pi.Length; j++)
                        {
                            string param = pi[j].ParameterType.FullName + " " + pi[j].Name;
                            Console.Write((j > 0 ? "," : "") + param);
                        }
                        Console.WriteLine(")");
                    }
                }
                dp.Close();
            }
            Console.ReadKey();
        }可是DynamicProxyFactory 这个类一直没法找到 VS2010也没自带。 请教大哥们。。

解决方案 »

  1.   

    http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=netfxsamples&DownloadId=3939页面最下面, 点I Agree,就可以下载
      

  2.   

    MSDN上提供了动态生成代理类的写法(稍作改写):这里的serviceUrl是类似http://127.0.0.1:6061/Service1的字符串
    if (serviceUrl.EndsWith("/"))
                {
                    serviceUrl += "mex";
                }
                MetadataExchangeClient mexClient = new MetadataExchangeClient(new EndpointAddress(serviceUrl));
                mexClient.ResolveMetadataReferences = true;
                MetadataSet metaDocs = mexClient.GetMetadata();
                WsdlImporter importer = new WsdlImporter(metaDocs);
                ServiceContractGenerator contractGenerator = new ServiceContractGenerator();
                
                Collection<ContractDescription> contracts = importer.ImportAllContracts();
                foreach (ServiceEndpoint endPoint in importer.ImportAllEndpoints())
                {
                    _endPoints.Add(endPoint);//把所有的endpoint收集起来,以后用
                }
                foreach (ContractDescription contract in contracts)
                {
                    contractGenerator.GenerateServiceContractType(contract);
                }
                if (contractGenerator.Errors.Count != 0)
                {
                    return "There were errors during code compilation.";
                }
                CodeDomProvider provider = CodeDomProvider.CreateProvider("C#");
                CodeGeneratorOptions options = new CodeGeneratorOptions();
                IndentedTextWriter textWriter = new IndentedTextWriter(new StreamWriter(proxyClass));
                provider.GenerateCodeFromCompileUnit(contractGenerator.TargetCompileUnit, textWriter, options);
                textWriter.Close();
                CompilerParameters compileoptions = new CompilerParameters();
                compileoptions.ReferencedAssemblies.Add("System.dll");
                compileoptions.CompilerOptions = "/lib:\"" + Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
                    + "\\Reference Assemblies\\Microsoft\\Framework\\v3.0\" ";//如果是在visual studio 2008里用需要加上这一句
                compileoptions.OutputAssembly = proxyAssembly;
                compileoptions.IncludeDebugInformation = false;
                compileoptions.GenerateInMemory = false;
                compileoptions.GenerateExecutable = false;            CompilerResults results = provider.CompileAssemblyFromDom(compileoptions, contractGenerator.TargetCompileUnit);
      

  3.   

    http://code.msdn.microsoft.com/netfxsamples/Release/ProjectReleases.aspx?ReleaseId=1626
    例子吧
      

  4.   

    DynamicProxyFactory应该是WCF服务的一个契约接口吧。在服务器端找应该能找到。
      

  5.   

    楼主给的方法好像是用程序生成代理类的例子,实际上还是用到代理类了,可以把WCF的数据格式做成JSON的,这样访问WCF就可以完全不需要代理类了,我们目前的项目都是这样做的,只要知道服务的地址和方法,参数,返回值即可。
      

  6.   

    谢谢大家 通过大家的指导我已经把方法写出来了。 可是这个方法并不高效! 希望大家看看我代码后给我点意见! //动态调用WCF方法
           public static object ExecuteMethod(string pUrl,string pMethodName, params object[] pParams)   
           {
                string serviceWsdlUri = pUrl;            DynamicProxyFactory factory = new DynamicProxyFactory(serviceWsdlUri);
                int count = 0;
                List<object> myEndpoints = new List<object>();            foreach (ServiceEndpoint endpoint in factory.Endpoints)
                {
                    myEndpoints.Add(endpoint.Contract.Name);
                }
                foreach (string endpoint in myEndpoints)
                {
                    DynamicProxy dp = factory.CreateProxy(endpoint);
                    OperationDescriptionCollection operations = factory.GetEndpoint(endpoint).Contract.Operations;
                    Type proxyType = dp.ProxyType;
                    MethodInfo[] mi = proxyType.GetMethods(BindingFlags.Public | BindingFlags.Instance);
                    for (int i = 0; i < mi.Length; i++)
                    {
                        string name = mi[i].Name;
                        if(name==pMethodName)
                        {
                            DynamicProxy proxy = factory.CreateProxy(endpoint);
                            return  proxy.CallMethod(pMethodName, pParams);
                        }
                    }
                    dp.Close();
                }
               return null;
            }