一、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. CDH建表字符集问题

    登陆metadata数据库: show variables like 'character_set%'; alter database hivemeta default character set l ...

  2. 乐字节Java构造器(构造方法|构造函数)、方法与内存分析

    一. 构造器(构造方法|构造函数) 在创建对象时(new),必会调用一个特殊的方法,这个方法是初始化对象信息的为new服务的.这个方法称为“构造器” 使用 new + 构造方法创建一个新的对象. 构造 ...

  3. Linux系统目录的学习

    1.在公司中linux 都是没有界面 2.系统路径    2.1 /表示根目录    2.2 ~表示/root    2.3etc:存放系统配置文件    2.4 home  除了root 以外所有用 ...

  4. 写一个单独的qt模块 -- ongoing

    彩阳发的链接: https://wiki.qt.io/Creating_a_new_module_or_tool_for_Qt

  5. Java面试笔记整理4

    一.Java内存溢出的产生原因和解决办法? java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都出于以下原因:JVM内存过小.程序不严密,产 ...

  6. springboot用controller跳转html页面

    之前SSM框架,里面有webapps文件夹,用来存放前端页面和各种前端资源,现在SpringBoot中没有webapps文件夹,springboot结构如下: 第一.resourses下文件夹publ ...

  7. C++基础--函数重载

    函数重载定义: 在相同的作用域中具有相同的函数名而函数形参列表(参数类型.参数个数.参数顺序)不同的两个函数,称之为函数重载.注意:函数返回值类型并不是重载的条件. 函数重载优点: 可以使用相同的函数 ...

  8. 搭建apache2.4+php7+mysql+phpmyadmin

    apache2.2不支持php7,会报错 cannot load php7apache2_4.dll into server 前排提示:保证安装文件夹和我的一致可以省事很多哦 下载地址 下载apach ...

  9. docker 实践一:简介和安装

    docker 的简介 docker 绝对是这几年来的重量级开源软件,它是使用 Go 实现的开源容器项目,分属于虚拟化技术. docker 和 虚拟机 docker 作为一种轻量级的虚拟化方式,在运行应 ...

  10. Intellij IDEA中启动多个微服务--开启Run Dashboard管理

    1.找到workspace.xml 2.添加配置 <option name="configurationTypes"> <set> <option v ...