一、什么是WebService
Web Service是一个使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的交互操作的应用程序。
Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。
二、创建一个简单的WebService
首先新建一个ASP.NET空网站,然后在项目名称上右击添加新项,在Visual C#中找到Web服务(ASMX)
,修改名称为WebServiceTest.asmx,点击添加
这里我们可以看到,在解决方案资源管理器中,新增两个文件,一个.asmx文件,一个.cs文件,这两个都是WebService的必要文件,其中.asmx文件提供服务部分,.cs文件提供逻辑部分
这里我们打开WebServiceTest.cs文件,方法上面的特性[WebMethod]是用来声明一个web服务方法,可以供服务端调用,如果不想被服务端调用仅在该类内部使用可以不加
接下来运行该文件,在该页面直接运行不调试(Ctrl + F5),可显示该页面
点击HelloWorld可显示,一个调用按钮,点击调用,可显示XML格式的HelloWorld
然后打开WebServiceTest.cs文件,写一些方法
[WebMethod]public int Plus(int a, int b){return a + b;}public int Minus(int a, int b){return a - b;}
然后再次打开运行不调试WebServiceTest.cs文件,这里Minus方法
没有添加特性[Method],因此在运行时不显示
点击Puls,可以看到,像两个数相加的页面,任意输入两个数,点击调用可以看到相关结果
这里也可以直接在主页地址栏URL后面添加 ?op=方法名 跳转指定方法体
这里再添加一个方法
[WebMethod]public List<UserInfo> Get(){return new List<UserInfo>(){new UserInfo() {id=101, name="莉莉", age=18, sex="女" },new UserInfo() {id=102, name="岚岚", age=18, sex="女" },new UserInfo() {id=103, name="安娜", age=18, sex="女" }};}
在浏览器地址栏URL后面添加 ?op=Get 点击调用,显示XML的数据
三、WebService的验证问题
1.使用SoapHeader进行验证
首先在WebServiceTest.cs文件里面新建一个用户信息类,包含用户的id,年龄,性别,名字等信息
/// <summary>
/// 用户信息
/// </summary>
public class UserInfo
{/// <summary>/// 用户ID/// </summary>public int id;/// <summary>/// 年龄/// </summary>public int age;/// <summary>/// 性别/// </summary>public string sex;/// <summary>/// 名字/// </summary>public string name;
}
然后再新建一个CustomSoapHeader类继承自SoapHeader,设置两个私有字段username,password,通过默认的构造函数和UserName、PassWord属性为其设置值,通过Validate方法验证用户名和密码
public class CustomSoapHeader : SoapHeader
{private string username = String.Empty;private string password = String.Empty;public CustomSoapHeader(){//这里的构造函数必须写}public CustomSoapHeader(string username, string password){this.username = username;this.password = password;}/// <summary>/// 获取或设置用户名/// </summary>public string UserName{get { return this.username; }set { this.username = value; }}/// <summary>/// 获取或设置用户密码/// </summary>public string PassWord{get { return this.password; }set { this.password = value; }}public bool Validate(){return this.username.Contains("s") && this.password.Contains("1");}
}
然后在WebServiceTest类中添加一个Get()方法
public CustomSoapHeader customSoapHeader;[WebMethod][SoapHeader("customSoapHeader")]public List<UserInfo> Get(int m){if (this.customSoapHeader != null && this.customSoapHeader.Validate() && m > 0){return new List<UserInfo>(){new UserInfo(){ id=101, age=18, sex="女", name="李静怡"},new UserInfo() {id=102, age=18, sex="女", name="李静怡"},new UserInfo() {id=102, age=18, sex="女", name="李静怡"}};}elsethrow new SoapException("身份验证不通过", SoapHeaderException.ServerFaultCode);}
然后在新建一个ASP.NE空网站,然后在项目名上右击点击添加Web 窗体
然后在项目名上右击点击添加服务引用,在地址栏处输入上一个项目中WebServiceTest.cs文件在浏览器中的运行地址,这里前提需要保持另一个项目运行,然后点击转到,系统会默认找到一个服务,然后点击确定。如果更改WebServiceTest.cs中的方法,需在服务引用上右击更新服务引用,如果运行还抛出异常,就点击配置服务引用,同时可以更改集合类型,对var类型适用,然后点击确定。
配置服务引用
整个项目结构
点击Web.config查看配置信息
在Default.aspx的Page_Load方法中进行调用,测试时可打断点,调试查看值
protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){using (ServiceReference1.WebServiceTestSoapClient soapClient = new ServiceReference1.WebServiceTestSoapClient()){//string类型"Hello World"var result1 = soapClient.HelloWorld();//int类型2var result2 = soapClient.Plus(1, 1);//int类型0var result3 = soapClient.Minus(1, 1);//可以点击配置服务引用更改集合类型为System.Collections.Generic.Listvar result4 = soapClient.Get(new ServiceReference1.CustomSoapHeader(){UserName = "s110",PassWord = "123456"}, 1);}}}
这里服务端的调用也可以采用Web 引用,在项目名上右击,点击添加,添加服务引用,然后点击高级,然后点击添加Web 引用,输入上一个项目中WebServiceTest.cs文件在浏览器中的运行地址,点击 ->
,设置 Web 引用名为WebReference,点击添加引用即可
这里ServiceReference1是服务引用,WebReference是Web 引用
接下来就用Web 引用简单试下
protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){#region Web 引用var webref = new WebReference.WebServiceTest();webref.CustomSoapHeaderValue = new WebReference.CustomSoapHeader(){UserName = "s110",PassWord = "123456"};//这里Get()方法的参数即WebService的参数,没有即没有参数,而服务引用至少有一个参数,并且该参数必须是继承自SoapHeader的实例,第二个及后面的参数即WebService的参数,没有就不写var result5 = webref.Get(1);#endregion}}