在服务器端,我注册了一些远程的webservice的地址,这些webservice都实现了同一个接口。
现在的问题是,怎么可以调用这些webservice呢。

解决方案 »

  1.   

    只知道 添加web引用 就直接可以new着用了
      

  2.   

    C#:引用后,会产生代理类,它会将webservice提供的接口转换为方法供调用.完了,只要动态更改url既个访问对应的webservie了.
      

  3.   

    因为我想这样的,外部的webservice统一实现接口后,只提供地址,在服务器注册了,服务器就能调用那些已经注册的webservice 的。
    添加web引用 就直接可以new,好像没有用的。
      

  4.   

    已经找到了答案。
    http://blog.csdn.net/zhoen/archive/2009/08/06/4419862.aspx
      

  5.   

    添加Web引用,就是Web Service 的URL,然后实例化对象调用
      

  6.   

    添加web引用之后会产生一个代理类,实例化这个代理类就可以调用WebService中的方法了
      

  7.   

    首先在你的项目中添加WEB引用然后用下面的
            /// <summary>
            /// 动态调用web服务
            /// 
            /// 调用示例
            /// string url = "http://www.webservicex.net/globalweather.asmx";
            /// string[] args = new string[2];
            /// args[0] = "shenzhen";
            /// args[1] = "China";
            /// object result = WebServiceHelper.InvokeWebService(url ,"GetWeather" ,args);
            /// this.label_Result.Text = result.ToString();
            /// </summary>
            /// <param name="url"></param>
            /// <param name="methodname"></param>
            /// <param name="args"></param>
            /// <returns></returns>
            public static object InvokeWebService(string url, string methodname, object[] args)
            {
                return WebServiceHelper.InvokeWebService(url, null, methodname, args);
            }        public static object InvokeWebService(string url, string classname, string methodname, object[] args)
            {
                string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
                if ((classname == null) || (classname == ""))
                {
                    classname = WebServiceHelper.GetWsClassName(url);
                }            try
                {
                    //获取WSDL
                    WebClient wc = new WebClient();
                    Stream stream = wc.OpenRead(url + "?WSDL");
                    ServiceDescription sd = ServiceDescription.Read(stream);
                    ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
                    sdi.AddServiceDescription(sd, "", "");
                    CodeNamespace cn = new CodeNamespace(@namespace);                //生成客户端代理类代码
                    CodeCompileUnit ccu = new CodeCompileUnit();
                    ccu.Namespaces.Add(cn);
                    sdi.Import(cn, ccu);
                    CSharpCodeProvider csc = new CSharpCodeProvider();
                    ICodeCompiler icc = csc.CreateCompiler();                //设定编译参数
                    CompilerParameters cplist = new CompilerParameters();
                    cplist.GenerateExecutable = false;
                    cplist.GenerateInMemory = true;
                    cplist.ReferencedAssemblies.Add("System.dll");
                    cplist.ReferencedAssemblies.Add("System.XML.dll");
                    cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
                    cplist.ReferencedAssemblies.Add("System.Data.dll");                //编译代理类
                    CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
                    if (true == cr.Errors.HasErrors)
                    {
                        System.Text.StringBuilder sb = new System.Text.StringBuilder();
                        foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
                        {
                            sb.Append(ce.ToString());
                            sb.Append(System.Environment.NewLine);
                        }
                        throw new Exception(sb.ToString());
                    }                //生成代理实例,并调用方法
                    System.Reflection.Assembly assembly = cr.CompiledAssembly;
                    Type t = assembly.GetType(@namespace + "." + classname, true, true);
                    object obj = Activator.CreateInstance(t);
                    System.Reflection.MethodInfo mi = t.GetMethod(methodname);                return mi.Invoke(obj, args);
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
                }
            }
      

  8.   

    最近刚刚用WebServices做完一个大型程序,一下是解决办法,应该很有帮助:1.如何解析出远程端的WebService,以便解析成我的编程语言,供我调用?
    方法:开始-》所有程序-》Microsoft Visual Studio 2005->Visual Studio Tools->Visual Studio 2005命令提示
    -》在黑屏状态下默认显示:C:\Programe Files\Microsoft Visual Studio 8\VC>
    -》我需要输入的是:wsdl /language:C# /n:WebSite1 /out:D:\MyProject\WebSite1\App_Code\aaa.cs http://111.74.216.94/His_Interface/Service.asmx?wsdl
    -》回车
    其中:out:后面是输出的路径  n后是命名空间,用来在我的程序中调用某一个函数方法时候,使用
            
            命名空间.ServiceName  abc=new 命名空间.ServiceName();
            string mn=abc.FangFa(a,b,c);//如果服务器端的方法是 public string FangFa(string a,mstring b.string c)系统将会自动生成一个 aaa.cs
    2.添加web引用,在URL处,浏览一下那个Web服务文件的 .asmx,添加OK。3:在后台代码中调用;protected void btnChaXun_Click(object sender, EventArgs e)
        {
            string ylzh = this.txtYLZH.Text.Trim();
            string name = this.txtName.Text.Trim();
            string shenfenzheng = this.txtSFZH.Text.Trim();
            string ylzh_last4 = this.txtYLBH4.Text.Trim();
            //其中WebServiceClient是在Visual Studio2005的命令行中输入的命名空间,即n后的内容,out为输出的路径!
            WebServiceClient.Service abc = new WebServiceClient.Service();
                    string checkk = abc.checkinhos_in(ylzh, name, shenfenzheng, ylzh_last4);
            if (checkk == "1")
            {
                //Response.Write("<script>alert('没有插入***!')</script>");
                this.labMessage.Text = "恭喜,已经登记!";
            }
            else if (checkk == "0")
            {
                this.labMessage.Text = "抱歉,没有登记!";
            }
            else if (checkk == "-1")
            {
                this.labMessage.Text = "不好意思,远程服务器出现错误!";
            }
            else
            {
                this.labMessage.Text = "远程服务器不行了,不是赛罕区医院的问题!";
            }
     }
      

  9.   

    添加web引用,是让visual studio帮你自动生成代理类,优点是方便,省力,缺点是定制功能不方便(比如需要监视soap消息,或者在代理类中添加自定义属性等。
    http://blog.csdn.net/zhoen/archive/2009/08/06/4419862.aspx
    这个连接里的方法是利用codedom动态生成代理类,优点是非常灵活,可以定制代理类(比如添加自定义属性等),wsdl改变时可以自动更新代理类,缺点是动态的效率不如静态生成高。
    但两种方法的本质都是一样的。web service的原理就是客户端根据wsdl生成代理类,基于xml和服务端通信,两头分别进行序列化/反序列化操作。