zoukankan      html  css  js  c++  java
  • WebService创建与使用

    因为项目中需要实现客户端与服务器端的数据交换,以及获取服务器端其他程序的分析结果,所以对WebService做了些简单的了解,现记录如下:

    一、WebService程序编写

    1、  在VS中新建空白网站

    2、  在空白网站中添加新建项,选择“web服务”

    3、  在web服务中写入需要向客服端提供的接口函数,我这里简单的写两个读取服务器中某个txt文档的内容并返回的函数。

     1   [WebService(Namespace = "http://tempuri.org/")]
     2     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
     3     [System.ComponentModel.ToolboxItem(false)]
     4     // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
     5     // [System.Web.Script.Services.ScriptService]
     6     public class Project3DInfoService : System.Web.Services.WebService
     7     {
     8 
     9         [WebMethod(Description = "模糊匹配")]
    10         public string getProjectBaseInfoFuzzyQuery(string prjName)
    11         {
    12             string txtFileName = @"D:NJ3DGISJsonStrs.txt";
    13             string JsonStr = File.ReadAllText(txtFileName, Encoding.Default);
    14             return JsonStr;
    15         }
    16 
    17         [WebMethod(Description = "精确匹配")]
    18         public string getProjectBaseInfo(string prjName)
    19         {
    20             string txtFileName = @"D:NJ3DGISJsonStr.txt";
    21             string JsonStr = File.ReadAllText(txtFileName, Encoding.Default);
    22             return JsonStr;
    23         }
    24     }

    二、WebService发布这里以最简单常用的IIS发布为例

    1、  打开IIS管理器,右击[应用池],添加应用程序池,注意选择.NET Framework版本。也可以直接使用现有的应用程序池。

    2、  右击现有的网站,选择添加应用程序,设置应用程序的物理路径为WebService程序所在的文件夹,文件目录选到asmx文件所在文件夹一级。并设置其他参数。

    3、  设置完成后右击新添加的应用程序—[管理应用程序]—[浏览]即可看到你写的函数,还可以输入参数查看返回结果。

         

    注:如果浏览器显示HTTP 错误 403.14 – Forbidden,可在IIS管理器功能视图界面,选择进入[目录浏览],在最右边面板上点击[启动]。

    三、客服端调用WebService

    客服端可以跨语言调用WebService,调用方法有多种。

    1、  添加服务引用  

    «右击项目程序[引用]—添加服务引用。在弹出的窗体界面中选择[高级]—[添加web引用],在URL一栏中输入WebService地址(就是[浏览]时浏览器显示的地址,把locahost改成服务器IP:端口号),点击[添加引用]完成添加;

    添加服务引用后

    «添加服务引用后就可直接调用WebService提供的接口函数了。但为了使程序具有可移植性,我们可以将WebService引用地址写在配置文件中,将服务引用的URL设置从配置文件中的读取值。具体做法就是修改Reference.cs(可在本地文件中找到,或者在服务的类名上按F12进入)代码中的”this.URL=  “的值设为从配置文件中读取。这样当服务器IP有变动或者需要部署到其他地方时只要修改配置文件中的相应URL值即可。

    这种方法最简单,但明显实用性不高。

    2、  WebService打包

    «WebService封装生成dll可参照这篇博客

    http://blog.csdn.net/gxxloveszj/article/details/8332584

    «WebService封装后可以直接添加该dll调用接口函数,不需要添加服务引用,但每次服务器有改动都需要重新封装一次。

    3、 动态调用web服务

    动态调用web服务只需要WebService编写方提供web服务URL和函数名,这个涉及到一些反射、CodeDom、编程使用C#编译器知识,说起来麻烦但使用起来很简单,详情可参考博客

    http://www.cnblogs.com/chenmfly/p/4463422.html

     代码如下,其中,url是Web服务的地址,methodname是要调用服务方法名,args是要调用Web服务所需的参数,返回值就是web服务返回的结果了

     public static object InvokeWebService(string url, string methodname, object[] args)
           {
               return InvokeWebServiceMy(url, null, methodname, args);
           }
    
           public static object InvokeWebServiceMy(string url, string classname, string methodname, object[] args)
           {
               string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
               if ((classname == null) || (classname == ""))
               {
                   classname = 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));
               }
           }
           private static string GetWsClassName(string wsUrl)
           {
               string[] parts = wsUrl.Split('/');
               string[] pps = parts[parts.Length - 1].Split('.');
    
               return pps[0];
           }  

    另外还可以使用HttpWebRequest等方法来动态调用web服务,网上也有不少详细资料,这里就不贴了。

  • 相关阅读:
    mysql and与or连用时遇到的坑
    mysql : 使用不等于过滤null的问题
    Bio Nio demo
    线上服务器的cpu使用达到100%了,如何排查、定位和解决该问题?
    二叉查找树、平衡二叉树、B树、B+树、聚集索引、非聚集索引
    java实现折线图统计数据
    递归构造树
    python中获取json数组中的具体数值(调用百度AI返回的json数据)
    python中使用ajax回调函数限制
    python+flask框架——前后端数据传递
  • 原文地址:https://www.cnblogs.com/pengdage110/p/5163838.html
Copyright © 2011-2022 走看看