WebService 在C#.NET中的使用

前言

  最近很多项目上需要是调用其他系统的Webservice服务进行处理业务,第一次真正在项目中使用,感觉有些地方需要注意,故写下此文章(本文完全是个人运用理解,理解有误处请多多指正)

一、创建WebService服务

 

WebService 在C#.NET中的使用

  在添加Web服务后,VS将自动生成WebService服务类,且包含HelloWorld服务方法,用户可以在此处自定义服务方法,如添加AddFunction服务方法,标记方法属性标识为[WebMethod]

    /// <summary>
    /// DianWebService 的摘要说明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
    // [System.Web.Script.Services.ScriptService]
    public class DianWebService : System.Web.Services.WebService
    {

        [WebMethod]//该属性标识为WebService服务方法
        public string HelloWorld()
        {
            return "Hello World";
        }

        [WebMethod]
        public int AddFunction(int a, int b)
        {
            return a + b;
        }
    }

二、调用WebService服务

  在.NET平台下,存在两种方式调用WebService服务:一是直接在项目中添加服务引用;二是通过动态代理来调用服务。

  

  方法一,项目中直接添加WebService服务引用(在项目菜单中选择“添加服务引用”)

WebService 在C#.NET中的使用

  说明:

  区域1:Webservice服务的地址

  区域2:设置Webservice服务的命名空间

  区域3:针对该引入的服务做进一步的详细配置,包括服务的访问权限、是否异步等

 

WebService 在C#.NET中的使用

  说明:

  区域1:定义引用的服务的访问权限,分为public和internal两种

  区域2:确定引入的服务是否生成异步操作(此处暂时还没搞清能用于干什么)

  区域3:配置web服务的高级配置,在此处配置后,才能够直接在项目中使用web服务类进行访问。否则无法直接访问服务中的接口方法。

 

  特别需要注意:如果此处没有添加web引用,VS在创建web服务时,只会自动生成对应的服务协议接口(***Soap)和服务代理类(***SoapClient),其实我们可以通过接口查看到Webservice服务中的公开接口方法,以及通过服务代理类调用web服务接口方法。

  比较明显的地方在于,未添加web引用时,VS自动创建的是服务引用(自动生成在Service References下),而添加引用后,vs创建的是web引用(自动成成在Web References下)。

  (此处的***Soap和***SoapClient两个命名不太规范,哪位大拿能否指点下这两个专业术语如何称呼)

WebService 在C#.NET中的使用

  说明:

  区域1:Webservice服务的地址

  区域2:web服务的引用名(web服务的子命名空间)

  区域3:操作添加web引用

//在项目中可以直接创建该WebService服务进行调用方法
            WebService.DianWebService web = new WebService.DianWebService();
            web.HelloWorld();
            web.AddFunction(1, 2);

  注意:调用Webservice服务的项目不能和提供Webservice服务的项目为同一个项目,否则会出现远程调用服务被关闭的异常,在测试代码时,可以使用一个项目调用另一个项目提供的服务(其中主要是方位不同地址或不同端口的Webservice服务就行)

 

方法二,通过动态代理来调用服务

  先创建一个动态代理的服务,之后在项目中需要用到的地方直接根据传递不同参数调用不同的Webservice服务

 public class Webservices
    {
        /// <summary<  
        /// 实例化WebServices  
        /// </summary<  
        /// <param name="url"<WebServices地址</param<  
        /// <param name="methodname"<调用的方法</param<  
        /// <param name="args"<把webservices里需要的参数按顺序放到这个object[]里</param<  
        public static object InvokeWebService(string namespaceName, string url, string methodname, object[] args)
        {

            //这里的namespace是需引用的webservices的命名空间,在这里是写死的,大家可以加一个参数从外面传进来。  
            if (string.IsNullOrEmpty(namespaceName))
                namespaceName = "ServiceWebTest";
            try
            {
                //获取WSDL  
                WebClient wc = new WebClient();
                Stream stream = wc.OpenRead(url + "?WSDL");
                ServiceDescription sd = ServiceDescription.Read(stream);
                string classname = sd.Services[0].Name;
                ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
                sdi.AddServiceDescription(sd, "", "");
                CodeNamespace cn = new CodeNamespace(namespaceName);

                //生成客户端代理类代码  
                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(namespaceName + "." + classname, true, true);
                object obj = Activator.CreateInstance(t);
                System.Reflection.MethodInfo mi = t.GetMethod(methodname);

                return mi.Invoke(obj, args);
            }
            catch
            {
                return null;
            }
        }
    }
//在需要调用服务的地方调用
  var objectUser = Webservices.InvokeWebService(namespaceName, url, methodname, new object[] { 1,2});
            Response.Write(objectUser);

  

WebService 在C#.NET中的使用,布布扣,bubuko.com

WebService 在C#.NET中的使用

上一篇:C#、ASP.NET获取当前应用程序的绝对路径


下一篇:.Net执行cmd命令