WebService
寄宿在IIS,也就是必须在网站项目
五大要素
(1)http传输信道/传输协议
它指定了A服务器到B服务器,数据是什么格式传递的
(2)XML的数据格式
数据是以xml格式传输的
(3)SOAP协议(简单对象访问协议)
它是一种封装格式,在分布式环境中,描述了如何交换数据的轻量级协议。
(4)WSDL
用于精确描述Web Service的文档格式, 也就是Web 服务描述语言。,在地址后面拼上wsdl,可以看到发布的服务上的一些方法信息,方法的返回类型等信息
(5)UDDI
UDDI的话,是一个跨产业,跨平台的开放性架构,可以帮助 Web 服务提供商在互联网上发布 Web 服务的信息。
UDDI 呢是一种目录服务,企业可以通过 UDDI 来注册和搜索 Web 服务。
简单来时候话,UDDI 就是一个目录,只不过在这个目录中存放的是一些关于 Web 服务的信息而已。
总体来说就是WebService遵循SOAP协议通过XML封装数据,然后由Http协议来传输数据。一次Web Service的调用,其实并不是方法的调用,而是发生SOAP消息(即xml文档片段)。
创建步骤
下面是在一个mvc项目中创建服务,选择红框中的数据:
下面是创建的代码:
/// <summary> /// MyWebService 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 //[System.Web.Script.Services.ScriptService] //如果需要服务对外开放 必须标记 [WebMethod] //数据库格式:XMl //方法不能重名; //WebService 5大要素: // public class MyWebService : System.Web.Services.WebService { public CustomSoapHeader CustomSoapHeaderPop { get; set; } /// <summary> /// 只有标记了[WebMethod]这个特性,才能够对外开放 /// </summary> /// <returns></returns> [WebMethod] public string HelloWorld() { return "Hello World"; } [WebMethod] [SoapHeader("CustomSoapHeaderPop")] public string Get() { if (!CustomSoapHeaderPop.Validate()) { throw new SoapException("认证失败", SoapException.ClientFaultCode); } return "欢迎大家来到.net高级班的Vip课程"; } [WebMethod] //如果需要服务对外开放 必须标记 [WebMethod] [SoapHeader("CustomSoapHeaderPop")] public string GetInfo() { if (!CustomSoapHeaderPop.Validate()) { throw new SoapException("认证失败", SoapException.ClientFaultCode); } return Newtonsoft.Json.JsonConvert.SerializeObject(new { Id = 123, Name = "棒棒糖" }); } [WebMethod] [SoapHeader("CustomSoapHeaderPop")] public string GetStudent(int i, string y) { if (!CustomSoapHeaderPop.Validate()) { throw new SoapException("认证失败", SoapException.ClientFaultCode); } return Newtonsoft.Json.JsonConvert.SerializeObject(new { i = i, y = y }); } [WebMethod] public UserInfo GetUserInfo(string name, string password) { //if (name.Equals("Richard")&&password.Equals("123456")) //{ //} return new UserInfo() { Id = 234, Name = "Richard" }; } [WebMethod] public List<UserInfo> GetInfoList(int i, string y) { return new List<UserInfo>() { new UserInfo() { Id = 345, Name = "阳光下的微笑" }, new UserInfo() { Id = 345, Name = "深海无息" } }; } }
界面展示:
比如点击一个GetInfoList:
结果:
返回的是xml格式数据。
需要注意的:
(1)webservice中方法名称不能重复,就算是参数不一致也不行
(2)要想对外展示就得添加[WebMethod]特性
IIS发布步骤
还有一个点,webservice对于列表数据是默认的数组的,所以在调用服务中的这个方法的时候,接收的时候直接List会报错,可以通过下面方式进行更改:
Jquery ajax调用webservice总结
WebService用户认证
因为webservice是对外开放的,所以可以被随意调用,所以必须要加限制,要不然不安全。
(1)Form认证
(2)windows认证
(3)服务方法里面添加账号密码参数
(4)SoapHeader验证
自定义的soap:
/// <summary> /// Header:分配个加密钥 账号密码加密 /// /// </summary> public class CustomSoapHeader : System.Web.Services.Protocols.SoapHeader { private string userName = string.Empty; private string passWord = string.Empty; public CustomSoapHeader()//必须有一个无参数的构造函数 { } /// <summary> /// 构造函数 这里的name和password是在调用服务的时候传来的 /// </summary> /// <param name="userName">用户名</param> /// <param name="passWord">密码</param> public CustomSoapHeader(string userName, string passWord) { this.userName = userName; this.passWord = passWord; } /// <summary> /// 获取或设置用户用户名 /// </summary> public string UserName { get { return userName; } set { this.userName = value; } } /// <summary> /// 获取或设置用户密码 /// </summary> public string PassWord { get { return passWord; } set { this.passWord = value; } } public bool Validate() { return this.UserName.Contains("Richard") && this.PassWord.Contains("123456"); } }
调用:
public void TestMethod1() { //using 有什么作用?释放资源,因为在这里是会创建连接的,是网络资源,如果不释放的话,还是会存在的。 using (MyWebServiceTest.MyWebServiceSoapClient client = new MyWebServiceTest.MyWebServiceSoapClient()) { MyWebServiceTest.CustomSoapHeader heade = new MyWebServiceTest.CustomSoapHeader(); heade.UserName = "Richard"; heade.PassWord = "123456"; string str = client.Get(heade); string info = client.GetInfo(heade); string studnet = client.GetStudent(heade, 123, "Richard"); str = client.GetAsync(heade).Result.GetResult; var userInfoList = client.GetInfoList(123, "Richard"); } }
关于WEB Service&WCF&WebApi实现身份验证之WEB Service篇
在