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

一、WebService程序编写

1、  在VS中新建空白网站

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

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

   [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 Project3DInfoService : System.Web.Services.WebService
{ [WebMethod(Description = "模糊匹配")]
public string getProjectBaseInfoFuzzyQuery(string prjName)
{
string txtFileName = @"D:\NJ3DGIS\JsonStrs.txt";
string JsonStr = File.ReadAllText(txtFileName, Encoding.Default);
return JsonStr;
} [WebMethod(Description = "精确匹配")]
public string getProjectBaseInfo(string prjName)
{
string txtFileName = @"D:\NJ3DGIS\JsonStr.txt";
string JsonStr = File.ReadAllText(txtFileName, Encoding.Default);
return JsonStr;
}
}

二、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 - ].Split('.'); return pps[];
}

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

WebService创建与使用的更多相关文章

  1. webservice创建、部署和调用

    webservice 可以用于分布式应用程序之间的交互,和不同程序之间的交互. 下面通过一个简单的例子来创建一个webservice,用的是vs2010开发工具 首先创建一个web应用程序 接着我们添 ...

  2. C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式

    C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...

  3. Java完成最简单的WebService创建及使用(REST方式,Jersey框架)

    前言: 一直以来都对WebService感兴趣,但因为难以理解WebService到底是什么,所以了解甚少.周二的时候有个跟我关系比较好的同事想要自己写个WebService的小Demo,希望能够做成 ...

  4. C#完成最简单的WebService创建及使用

    打开Visual Studio(我用的是2010)→文件→新建→项目→Visual C#→Web→ASP.NET Web 服务应用程序 打开Service1.asmx文件,会看到里面已经有个Hello ...

  5. C# WebService创建与使用

    WebService现在虽然有更好的方式去替代它,但是它简单,开发成本低.很简单,对着本文一看就会 1.WebService的创建开发 2.WebService的发布测试 3.WebService的调 ...

  6. C# WebService创建、发布、调用的简单例子

    Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. Web ...

  7. webservice 创建及调用

    1.创建一个空白项目 2.在此项目上新建项--添加一个web服务 (.asmx) 这样就创建好了一个webservice --------------------------------------- ...

  8. C# VS2019 WebService创建与发布,并部署到Windows Server 2012R

    前言 上一次数据库灾备和性能优化后,数据库专家建议,在不扩容的情况下,客户端不能再频繁的扫描数据库了!一句惊醒梦中人,因为我也发现数据库越来越卡了,自从上个项目上线后,就出现了这个情况.后来分析其原因 ...

  9. WebService 创建、发布、调用

    环境Win7+VS2017 启用IIS 查看iis是否启用 新建 ASP.NET Web 应用程序 项目,项目中添加Web 服务 在 asmx  文件中添加需要的方法 运行结果 发布 创建新的文件夹, ...

随机推荐

  1. C#Linq技术中SelectMany(...)的内部实现推测

    对于声明为:public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable&l ...

  2. 安装VS2015历险记

    最近,因为一些需求,需要在家里的笔记本上安装VS2015.本来以为一件很容易的一件事,发现做起来遇到了很多坑. 首先,下载VS2015,这就花费了两三个小时,安装包太大了.下载完,安装.安装不成功,报 ...

  3. display:inline-block会产生空隙

    display:inline-block会产生空隙 解决方法:font-size:0;letter-spacing:-4px

  4. win7系统网卡驱动正常,网线连接设备正常,但电脑右下角网络图片显示一直在转圈或者显示一个黄色感叹号的解决办法

    今天遇到一个问题是电脑的win7系统一直都可以连接有线,但今天突然连接不了.在我的电脑右键-->管理--->设备管理器-->网络适配器,里面查看了网络适配器安装正常.但是电脑右下角的 ...

  5. python import cv2 出错:cv2.x86_64-linux-gnu.so: undefined symbol

    之前写过一个python使用opencv处理图片的脚本,当时是可以使用的,现在突然发现执行时出错: ImportError: /usr/lib/python2.7/dist-packages/cv2. ...

  6. Android基础学习第三篇—Intent的用法

    写在前面的话: 1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对 ...

  7. 剑指Offer-【面试题05:从头到尾打印链表】

    package com.cxz.question5; import java.util.Stack; /* * 输入个链表的头结点,从尾到头反过来打印出每个结点的值. * */ public clas ...

  8. [BI项目记]-TFS Express备份和恢复

    在项目中对TFS进行备份操作是日常重要的工作之一,此篇主要描述如何对TFS Express进行备份,并且在另外一台服务器上进行恢复. 以下是操作的几个关键点: 备份数据库,在TFS管理工具中就可以完成 ...

  9. MySQL性能优化总结

    一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ...

  10. Linux的简单介绍和常用命令的介绍

    Linux的简单介绍和常用命令的介绍 本说明以Ubuntu系统为例 Ubuntu系统的安装自行百度,或者参考http://www.cnblogs.com/CoderJYF/p/6091068.html ...