WebService

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篇

 

 

 

 

 

 

 

 

 

 

posted @ 2021-10-14 00:23  安静点--  阅读(420)  评论(0编辑  收藏  举报