一、Web Services简介

Web Services是支持客户端与服务器通过网络互操作的一种软件系统,是一组可以通过网络调用的应用程序API。

Web 服务是一个软件接口,它描述了一组可以在网络上通过标准化的 XML 消息传递访问的操作。Web Service 最基本的组成部分为服务的提供者(Service Provider)和服务的请求者(Service Requester)。Web Service 两端的应用是通过基于标准的 XML 格式的协议进行通信的,这种最常用的协议就是 SOAP(Simple Object Access Protocol)。

1、实现方式

WebService原来有两种方式,一是SOAP协议方式,在这种方式下需要WSDL,UDDI等,二是REST方式,这种方式根本不需要WSDL,UDDI等。

REST是完全不同的思路,它充分利用了HTTP协议的4个主要verb把RPC操作分成4类:

- GET:进行幂等的资源获取操作

- POST:创建资源

- PATCH:修改资源

- DELETE:删除资源

备注:RESTful是个形容词,形容根据这个思路设计出来的REST风格的API

  1. SOAP:Simple Object Access Protocol 简单对象访问协议(XML,RPC实现)。异步处理与调用,形式化契约,有状态的操作。
  2. REST:Representational State Transfer 表示性状态转移(HTTP,URL实现)。有限的带宽和资源,完全无状态的操作,缓存考虑。

2、SOAP协议:Simple Object Access Protocol,简单对象访问协议

它是在分散或分布式的环境中交换信息的简单协议,是一种基于XML的协议,需要绑定一个网络传输协议来完成信息的传输,这个协议通常是Http或Https,但也可以使其他协议。

SOAP可以理解为SOAP=HTTP+RPC+XML。

  它包括四个部分:

  • SOAP封装:它定义了一个框架,描述消息中的内容是描述,是谁发送的,谁又应当接收并处理;
  • SOAP编码规则:定义了一种序列化的机制,用于表示应用程序需要使用的数据类型的实例;
  • SOAP RPC:表示一种协定,用于表示远程过程调用和应答;
  • SOAP绑定:它定义了SOAP使用哪种协议来进行交换信息。使用Http/TCP/UDP都可以。与WCF中的绑定概念一致。

1、SOAP包:soap是一种协议,也是一种用于发送消息的格式,所以可以叫它soap包.

Soap包由封套Envelope(信封)组成,信封由一个soap头和包体组成,其中包体是必须的。

  换句话说,SOAP协议只是用来封装消息用的,封装后的消息你可以通过各种已有的协议来传输,如Http、Https、Tcp、UDP、SMTP等,甚至你还可以自定义协议。然而Web Service是采用基于Http协议来传输数据的。

关于使用Https协议来访问Web Services的方法可以参考这个文章:如何利用 SSL 调用 Web 服务

2、UDDI:统一描述、发现和集成(Universal Description, Discovery, and Integration)

它是一个基于XML的跨平台的描述规范,可以使世界范围内的企业在互联网上发布自己所提供的服务供其他客户查询使用。

3、WSDL:Web服务描述语言(Web Services Description Language),

它是为描述Web服务发布的XML格式。用于描述服务器端口访问方式和使用协议的细节,通常用来辅助生产服务器和客户端代码及配置信息。

二、WebService

1、建立Web服务

在空的Web服务项目中,添加Web服务项: SelftSerivice.asmx。运行一次。

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class SelftSerivice : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
}

2、在客户调用端:

首先生成代理,在同一解决方案中,添加一个控制台项目,添加一“服务引用”,直接从web服务地址查找服务生成代理。

然后调用:

internal class Program
{
private static void Main(string[] args)
{
FirstInstance.SelftSeriviceSoapClient client = new FirstInstance.SelftSeriviceSoapClient();
Console.WriteLine(client.HelloWorld());
}
}

3、使用Fiddler工具进行抓包分析

这是客户端请求时的包(http头省略):

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<HelloWorld xmlns="http://tempuri.org/" xmlns:a="http://schemas.datacontract.org/2004/07/
UnicodeTest.FirstInstance" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"/>
</s:Body>
</s:Envelope>

这是服务端响应的包:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<HelloWorldResponse xmlns="http://tempuri.org/">
<HelloWorldResult>Hello World</HelloWorldResult>
</HelloWorldResponse>
</soap:Body>
</soap:Envelope>

三、如何对类实例进行传输

[WebMethod]
public Customer GetCustomer()
{
Customer customer = new Customer
{
Unid = 13,
CustomerName = "Songjiang",
CreateTime = DateTime.Now,
Telephone = new Call
{
Mobile = "1111111",
FirmCall = "2222",
HomeCall = "3333"
}
};
return customer;
}

客户端:

public void TestCustomerSoap()
{
ws.Customer customer = new ws.Customer();
ws.SelfService client = new ws.SelfService();
customer = client.GetCustomer();
Console.WriteLine(customer.CustomerName);
}

从WS返回的soap包是:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetCustomerResponse xmlns="http://tempuri.org/">
<GetCustomerResult>
<Unid>13</Unid>
<CustomerName>Songjiang</CustomerName>
<CreateTime>2010-03-31T11:40:52.3125+08:00</CreateTime>
<Telephone>
<HomeCall>3333</HomeCall>
<Mobile>1111111</Mobile>
<FirmCall>2222</FirmCall>
</Telephone>
</GetCustomerResult>
</GetCustomerResponse>
</soap:Body>
</ soap:Envelope >

四、SoapFormatter

包中实例的的内容与xml数据格式化是很相近的。只是在整个过程中,自己没有进行显式的xml格式化,而由ws进行soap序列化。

Soap序列化器“SoapFormatter”,同XmlSerializer一样,也是把数据保存成xml文件,里面除了保存的内容还有些额外的Soap信息。

XmlSerializer见: https://www.cnblogs.com/springsnow/p/9469399.html

添加名称空间:using System.Runtime.Serialization.Formatters.Soap;

public void TestSoapSerialize()
{
Customer customer = new Customer
{
Unid = 13,
CustomerName = "Songjiang",
CreateTime = DateTime.Now,
Telephone = new Call
{
Mobile = "1111111",
FirmCall = "2222",
HomeCall = "3333"
}
};
FileStream fs = new FileStream("xmlSoap.xml", FileMode.Create);
SoapFormatter formatter = new SoapFormatter();
formatter.Serialize(fs, customer);
fs.Close();
}

内容为一个完整的封套。

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetCustomerResponse xmlns="http://tempuri.org/">
<GetCustomerResult>
<Unid>13</Unid>
<CustomerName>Songjiang</CustomerName>
<CreateTime>2010-03-31T11:40:52.3125+08:00</CreateTime>
<Telephone>
<HomeCall>3333</HomeCall>
<Mobile>1111111</Mobile>
<FirmCall>2222</FirmCall>
</Telephone>
</GetCustomerResult>
</GetCustomerResponse>
</soap:Body>
</ soap:Envelope >

五、客户端配置文件

注意下面客户端终结点的“bindingConfiguration”要引用在bindings节点中的配置的名称。如IScbcWebserviceEntranceServiceSoapBinding。

<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="SAPServiceSoap" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" />
<binding name="IScbcWebserviceEntranceServiceSoapBinding" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://10.118.1.2:8010/wsSCBC.asmx" binding="basicHttpBinding"
bindingConfiguration="wsSCBCSoap" contract="ServiceReference1.wsSCBCSoap" name="wsSCBCSoap" />
<endpoint address="http://10.126.124.35:8081/ekp/sys/webservice/scbcWebserviceEntrance" binding="basicHttpBinding"
bindingConfiguration="IScbcWebserviceEntranceServiceSoapBinding" contract="OAFlow.IScbcWebserviceEntrance" name="IScbcWebserviceEntrancePort" />
</client>
</system.serviceModel>
</configuration>

客户端代码需要引用终结点配置名。如IScbcWebserviceEntrancePort。

OAFlow.ScbcWebserviceEntranceClient oaFlow = new OAFlow.ScbcWebserviceEntranceClient("IScbcWebserviceEntrancePort");

string ret = oaFlow.execute(o.ToString());

1、修改WebService接收长度:

<binding name="SAPServiceSoap"  maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" />

WCF之WebService的更多相关文章

  1. (转)将wcf 以webservice的方式调用

    将wcf 以webservice的方式调用 问题:a公司使用wcf 发布服务(.net Framework 3.0 or 3.5),b公司需要使用a公司发布的服务 ,但b公司目前阶段只使用.net F ...

  2. 请问WCF 跟 WebService之间的相同跟异同

    https://social.msdn.microsoft.com/Forums/zh-CN/c06420d1-69ba-4aa6-abe5-242e3213b68f/wcf-webservice W ...

  3. .NET 的 WCF 和 WebService 有什么区别?(转载)

    [0]问题: WCF与 Web Service的区别是什么? 和ASP.NET Web Service有什么关系? WCF与ASP.NET Web Service的区别是什么? 这是很多.NET开发人 ...

  4. 关于wcf,webservice,webapi或者其他服务或者接口有什么区别 WCF、WebAPI、WebService之间的区别 【转载】HTTP和SOAP完全就是两个不同的协议 WebService学习总结(一)——WebService的相关概念

    wcf,webservice采用的是rpc协议,这个协议很复杂,所以每次要传递.要校验的内容也很复杂,别看我们用的很简单,但实际是frame帮我们做掉了rpc生成.解析的事情webapi遵循是rest ...

  5. WCF探索之旅(五)——WCF与WebService的异同

    前几篇文章我们简单的介绍了WCF以及怎样使用它,今天我们来讨论一下WCF和WebService的异同. 相信大多数同学跟我一样,对于WebService有所了解.并且应该说你是先听说WebServic ...

  6. WCF与WebService的区别

    1.WebService:严格来说是行业标准,不是技术,使用XML扩展标记语言来表示数据(这个是夸语言和平台的关键).微软的Web服务实现称为ASP.NET Web Service.它使用Soap简单 ...

  7. WCF和WebService中获取当前请求报文的方法

    WCF中: 1. 在hosting WCF的web.config中加入: <system.serviceModel> <serviceHostingEnvironment aspNe ...

  8. 浅析WCF与WebService、WPF与Silverlight 区别

    由于在<Windows服务调用Quartz.net 实现消息调度>中,涉及到ASP.NET Web Service //WebServiceSoapClient client = new ...

  9. wcf和webservice区别

    1.WebService:严格来说是行业标准,不是技术,使用XML扩展标记语言来表示数据(这个是夸语言和平台的关键).微软的Web服务实现称为ASP.NET Web Service.它使用Soap简单 ...

  10. WCF与WebService的区别(转)

    1.WebService:严格来说是行业标准,不是技术,使用XML扩展标记语言来表示数据(这个是夸语言和平台的关键).微软的Web服务实现称为ASP.NET Web Service.它使用Soap简单 ...

随机推荐

  1. jquery-easyui中改变【确认框控件的按钮文字】($.messager.confirm)

    根据API这句话,就很自然想到重写该方法,代码如下: $.messager.defaults = { ok: "通过", cancel: "不通过" ,widt ...

  2. web前端常用meta整理

    标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他 web 服务. 页面关键词 <meta ...

  3. python中文编码 - python基础入门(5)

    python到目前为止,一共有两个版本,分别是2.x和3.x版本,根据官方正式通知2020年停止对python更新和维护,距离今天还有110天左右,所以正在学习python的小伙伴应该暗中庆幸一波. ...

  4. postman带Token测试接口

    首先打开postman.是这样的界面 我们的需求是这样的.实现登录之后返回token.然后请求其他接口时在header头中带上token信息. OK.接下来我们这样操作: 现在登录没有操作token. ...

  5. Redis 常用命令学四:有序集合类型命令

    1.增加元素,修改存在元素的分数 127.0.0.1:6379> zadd score 99 a 88 b 66 c (integer) 3 127.0.0.1:6379> ZADD sc ...

  6. 使用 IDEA 创建 maven 项目

    文章目录 第一步 第二步 第三步 目录结构的设置 看下 web.xml 配置文件 第一步 点击 maven : 勾选从模板创建 : 选择 webapp : 第二步 第三步 如果你自己对 maven 进 ...

  7. python第四天---元组和字典的魔法

    # 元组,元素不可以更改.增加.删除 # 元组的第一级元素不可修改.删除.增加 # 一般写元组是,最后加上逗号 tu = (123, "wdsd", 213, (213, 213) ...

  8. Python习题002

    作业1:判断某一个字符串是否是小数 def is_float(string): string1 = str(string) if string1.count('.') > 1: #检测字符串小数 ...

  9. Python开发【第五章】:常用模块

    一.模块介绍: 1.模块定义 用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质上就是.py结尾python文件 分类:内置模块.开源模块.自定义模块 2.导入模块 本质:导 ...

  10. 关于OI中的各种数学

    学到后面数学越来越多了,感觉好难啊,开个博客专门记录一下数学相关的东西 因为反正也没人看,所以主要还是给自己看的 一些符号: 数论函数的卷积:$\ast$,$ h = f \ast g$ 则 $h(n ...