none
c# web服务引用 RRS feed

答案

  • 找到方法了

     public static string[] GetMethod(string nameSpace, string className, string methodName, object[] param)
            {
                System.Net.WebClient client = new System.Net.WebClient();
    
                String url = System.Configuration.ConfigurationManager.ConnectionStrings["serviceAddress"].ConnectionString;//这个地址可以写在Config文件里面,这里取出来就行了.在原地址后面加上: ?WSDL   
                System.IO.Stream stream = client.OpenRead(url);
                System.Web.Services.Description.ServiceDescription description = System.Web.Services.Description.ServiceDescription.Read(stream);
    
                System.Web.Services.Description.ServiceDescriptionImporter importer = new System.Web.Services.Description.ServiceDescriptionImporter();//创建客户端代理代理类。   
    
                importer.ProtocolName = "Soap"; //指定访问协议。   
                importer.Style = System.Web.Services.Description.ServiceDescriptionImportStyle.Client; //生成客户端代理。   
                importer.CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties | System.Xml.Serialization.CodeGenerationOptions.GenerateNewAsync;
    
                importer.AddServiceDescription(description, null, null); //添加WSDL文档。   
    
                System.CodeDom.CodeNamespace nmspace = new System.CodeDom.CodeNamespace(); //命名空间   
                nmspace.Name = nameSpace;
                System.CodeDom.CodeCompileUnit unit = new System.CodeDom.CodeCompileUnit();
                unit.Namespaces.Add(nmspace);
    
                System.Web.Services.Description.ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
                System.CodeDom.Compiler.CodeDomProvider provider = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("CSharp");
    
                System.CodeDom.Compiler.CompilerParameters parameter = new System.CodeDom.Compiler.CompilerParameters();
                parameter.GenerateExecutable = false;
                parameter.OutputAssembly = "TempClass.dll";//输出程序集的名称   
                parameter.ReferencedAssemblies.Add("System.dll");
                parameter.ReferencedAssemblies.Add("System.XML.dll");
                parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
                parameter.ReferencedAssemblies.Add("System.Data.dll");
    
                System.CodeDom.Compiler.CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
                if (result.Errors.HasErrors)
                {
                    // 显示编译错误信息   
                }
    
                System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom("TempClass.dll");//加载前面生成的程序集   
                Type t = asm.GetType(nameSpace + "." + className);
    
                object o = Activator.CreateInstance(t);
                System.Reflection.MethodInfo[] method = t.GetMethods();//GetPersons是服务端的方法名称,你想调用服务端的什么方法都可以在这里改,最好封装一下
                string[] mothods = new string[method.Length-1];
                for (int i = 0; i < method.Length; i++)
                    mothods[i] = method[i].Name;
    
                return mothods;
            }  


    Hero

    2012年2月17日 1:41

全部回复

  • 自己写SOAP或者socket……不过发明轮子干什么?


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    2012年2月15日 6:12
    版主
  • 你好 你可以自己发送Soap请求到服务器端 然后再自己解析服务器端返回的内容,并且反序列化/解析 自己需要的内容;但是这样不如直接添加引用方便快捷;也可以直接使用自带的类,参考此类 http://msdn.microsoft.com/zh-cn/library/system.web.services.protocols.soaphttpclientprotocol.aspx 


    Raymond Tang (Microsoft C# MVP)
    Denn Ich Gehoer nur mir
    微软中文论坛同城社区成都QQ群:74268428
    My Blog http://kosmisch.net
    Chengdu,China

    2012年2月15日 12:07
    版主
  • 找到方法了

     public static string[] GetMethod(string nameSpace, string className, string methodName, object[] param)
            {
                System.Net.WebClient client = new System.Net.WebClient();
    
                String url = System.Configuration.ConfigurationManager.ConnectionStrings["serviceAddress"].ConnectionString;//这个地址可以写在Config文件里面,这里取出来就行了.在原地址后面加上: ?WSDL   
                System.IO.Stream stream = client.OpenRead(url);
                System.Web.Services.Description.ServiceDescription description = System.Web.Services.Description.ServiceDescription.Read(stream);
    
                System.Web.Services.Description.ServiceDescriptionImporter importer = new System.Web.Services.Description.ServiceDescriptionImporter();//创建客户端代理代理类。   
    
                importer.ProtocolName = "Soap"; //指定访问协议。   
                importer.Style = System.Web.Services.Description.ServiceDescriptionImportStyle.Client; //生成客户端代理。   
                importer.CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties | System.Xml.Serialization.CodeGenerationOptions.GenerateNewAsync;
    
                importer.AddServiceDescription(description, null, null); //添加WSDL文档。   
    
                System.CodeDom.CodeNamespace nmspace = new System.CodeDom.CodeNamespace(); //命名空间   
                nmspace.Name = nameSpace;
                System.CodeDom.CodeCompileUnit unit = new System.CodeDom.CodeCompileUnit();
                unit.Namespaces.Add(nmspace);
    
                System.Web.Services.Description.ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
                System.CodeDom.Compiler.CodeDomProvider provider = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("CSharp");
    
                System.CodeDom.Compiler.CompilerParameters parameter = new System.CodeDom.Compiler.CompilerParameters();
                parameter.GenerateExecutable = false;
                parameter.OutputAssembly = "TempClass.dll";//输出程序集的名称   
                parameter.ReferencedAssemblies.Add("System.dll");
                parameter.ReferencedAssemblies.Add("System.XML.dll");
                parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
                parameter.ReferencedAssemblies.Add("System.Data.dll");
    
                System.CodeDom.Compiler.CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
                if (result.Errors.HasErrors)
                {
                    // 显示编译错误信息   
                }
    
                System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom("TempClass.dll");//加载前面生成的程序集   
                Type t = asm.GetType(nameSpace + "." + className);
    
                object o = Activator.CreateInstance(t);
                System.Reflection.MethodInfo[] method = t.GetMethods();//GetPersons是服务端的方法名称,你想调用服务端的什么方法都可以在这里改,最好封装一下
                string[] mothods = new string[method.Length-1];
                for (int i = 0; i < method.Length; i++)
                    mothods[i] = method[i].Name;
    
                return mothods;
            }  


    Hero

    2012年2月17日 1:41