最简单的调用当然是服务引用,但是我更想原生调用,所以希望能通过报文有如下研究

1.报文分析

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" name="DemoService" targetNamespace="http://tempuri.org/">
<wsdl:types>
<xsd:schema targetNamespace="http://tempuri.org/Imports">
<xsd:import schemaLocation="http://dev.xxx.io/Demo/DemoService.svc?xsd=xsd0" namespace="http://tempuri.org/"/>
<xsd:import schemaLocation="http://dev.xxx.io/Demo/DemoService.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
<xsd:import schemaLocation="http://dev.xxx.io/Demo/DemoService.svc?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/Contracts.Models.Demo"/>
<xsd:import schemaLocation="http://dev.xxx.io/Demo/DemoService.svc?xsd=xsd3" namespace="http://schemas.datacontract.org/2004/07/DataTypes"/>
<xsd:import schemaLocation="http://dev.xxx.io/Demo/DemoService.svc?xsd=xsd4" namespace="http://schemas.datacontract.org/2004/07/System"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="IDemoService_DoSomething_InputMessage">
<wsdl:part name="parameters" element="tns:DoSomething"/>
</wsdl:message>
<wsdl:message name="IDemoService_DoSomething_OutputMessage">
<wsdl:part name="parameters" element="tns:DoSomethingResponse"/>
</wsdl:message>
<wsdl:portType name="IDemoService">
<wsdl:operation name="DoSomething">
<wsdl:input wsaw:Action="http://tempuri.org/IDemoService/DoSomething" message="tns:IDemoService_DoSomething_InputMessage"/>
<wsdl:output wsaw:Action="http://tempuri.org/IDemoService/DoSomethingResponse" message="tns:IDemoService_DoSomething_OutputMessage"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="BasicHttpBinding_IDemoService" type="tns:IDemoService">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="DoSomething">
<soap:operation soapAction="http://tempuri.org/IDemoService/DoSomething" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="DemoService">
<wsdl:port name="BasicHttpBinding_IDemoService" binding="tns:BasicHttpBinding_IDemoService">
<soap:address location="http://dev.xxx.io/Demo/DemoService.svc"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

可以看到

1.wcf服务地址

http://dev.xxx.io/Demo/DemoService.svc

2.引用了4个命名空间
Serialization
Contracts.Models.Demo
DataTypes
System

3.Service的名称及接口

DemoService,
IDemoService 4.服务接口的方法
DoSomething 再访问
 
来读取类型的具体字段
http://dev.xxx.io/Demo/DemoService.svc?xsd=xsd3
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.datacontract.org/2004/07/DataTypes" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/DataTypes">
<xs:complexType name="Request">
<xs:sequence>
<xs:element minOccurs="" name="UserId" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Request" nillable="true" type="tns:Request"/>
<xs:complexType name="Response">
<xs:sequence>
<xs:element minOccurs="" name="ErrorCode" type="xs:int"/>
<xs:element minOccurs="" name="Message" nillable="true" type="xs:string"/>
<xs:element minOccurs="" name="Success" type="xs:boolean"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Response" nillable="true" type="tns:Response"/>
</xs:schema>

http://dev.xxx.io/Demo/DemoService.svc?xsd=xsd0

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tempuri.org/" elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
<xs:import schemaLocation="http://dev.xxx.io/Demo/DemoService.svc?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/Contracts.Models.Demo"/>
<xs:element name="DoSomething">
<xs:complexType>
<xs:sequence>
<xs:element xmlns:q1="http://schemas.datacontract.org/2004/07/Contracts.Models.Demo" minOccurs="" name="request" nillable="true" type="q1:SomeReq"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="DoSomethingResponse">
<xs:complexType>
<xs:sequence>
<xs:element xmlns:q2="http://schemas.datacontract.org/2004/07/Contracts.Models.Demo" minOccurs="" name="DoSomethingResult" nillable="true" type="q2:SomeResp"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

http://dev.xxx.io/Demo/DemoService.svc?xsd=xsd2

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.datacontract.org/2004/07/Contracts.Models.Demo" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/Contracts.Models.Demo">
<xs:import schemaLocation="http://dev.xxx.io/Demo/DemoService.svc?xsd=xsd4" namespace="http://schemas.datacontract.org/2004/07/System"/>
<xs:import schemaLocation="http://dev.xxx.io/Demo/DemoService.svc?xsd=xsd3" namespace="http://schemas.datacontract.org/2004/07/DataTypes"/>
<xs:complexType name="SomeReq">
<xs:complexContent mixed="false">
<xs:extension xmlns:q1="http://schemas.datacontract.org/2004/07/DataTypes" base="q1:Request">
<xs:sequence>
<xs:element minOccurs="" name="Date" type="xs:dateTime"/>
<xs:element xmlns:q2="http://schemas.datacontract.org/2004/07/System" minOccurs="" name="DateUTC" type="q2:DateTimeOffset"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="SomeReq" nillable="true" type="tns:SomeReq"/>
<xs:complexType name="SomeResp">
<xs:complexContent mixed="false">
<xs:extension xmlns:q3="http://schemas.datacontract.org/2004/07/WHTR.DataTypes" base="q3:Response">
<xs:sequence>
<xs:element minOccurs="" name="Date" type="xs:dateTime"/>
<xs:element minOccurs="" name="DateStr" nillable="true" type="xs:string"/>
<xs:element minOccurs="" name="ResultDate" nillable="true" type="xs:string"/>
<xs:element minOccurs="" name="ResultDateUTC" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="SomeResp" nillable="true" type="tns:SomeResp"/>
</xs:schema>

根据以上信息,可以生成的最简单的 Contract代码如下:

[Serializable]
[DataContract(Name = "Response", Namespace = "http://schemas.datacontract.org/2004/07/DataType")] public class Response
{
[DataMember]
public int ErrorCode { get; set; }
[DataMember]
public string Message { get; set; }
[DataMember]
public bool Success { get; set; }
} /// <summary>
/// SomeResponse
/// </summary>
[DataContract(Name = "SomeResp", Namespace = "http://schemas.datacontract.org/2004/07/DataType")] [Serializable]
public sealed class SomeResp : Response
{
/// <summary>
/// 时间格式的Date
/// </summary>
[DataMember]
public DateTime Date { get; set; } /// <summary>
/// 格式成字符串的时间
/// </summary>
[DataMember]
public string DateStr { get; set; } /// <summary>
/// 返回传入的Date
/// </summary>
[DataMember]
public string ResultDate { get; set; } /// <summary>
/// 返回传入的Date
/// </summary>
[DataMember]
public string ResultDateUTC { get; set; }
} [Serializable] [DataContract(Name = "Request", Namespace = "http://schemas.datacontract.org/2004/07/Contracts.Models.Demo")]
public class Request
{
[DataMember]
public string UserId { get; set; }
} /// <summary>
/// SomeRequest
/// </summary>
[DataContract(Name = "SomeReq", Namespace = "http://schemas.datacontract.org/2004/07/Contracts.Models.Demo")]
[Serializable] public sealed class SomeReq : Request
{
/// <summary>
/// 时间
/// </summary>
[DataMember]
public DateTime Date { get; set; } /// <summary>
/// Data
/// </summary>
[DataMember]
public DateTimeOffset DateUTC { get; set; } } /// <summary>
/// IDemoService
/// </summary>
[ServiceContract ] public interface IDemoService
{
/// <summary>
/// Does something.
/// </summary>
/// <param name="request">The request.</param>
/// <returns></returns>
[OperationContract ]
SomeResp DoSomething(SomeReq request);
}

具体调用代码如下:

using System.Runtime.Serialization;
using System.ServiceModel;

EndpointAddress address = new EndpointAddress("http://dev.xxx.io/Demo/DemoService.svc?wsdl");
BasicHttpBinding binding = new BasicHttpBinding();
ChannelFactory<IDemoService> factory = new ChannelFactory<IDemoService>(binding, address);
IDemoService channel = factory.CreateChannel(); var result = channel.DoSomething(new SomeReq()
{
Date = DateTime.Now
});

wcf第3步之报文分析及原生调用的更多相关文章

  1. 一次http完整的请求tcp报文分析

    一次http请求的报文分析 数据包如下: 第一个包113.31的主机(下边称之为客户端)给114.80的主机(下边称之为服务器)发送一个syn包请求建立连接 第二个包服务器回复客户端syn+ack表示 ...

  2. Wireshark安装使用及报文分析(图文详解)

    Wireshark是世界上最流行的网络分析工具.这个强大的工具可以捕捉网络中的数据,并为用户提供关于网络和上层协议的各种信息.与很多其他网络工具一样,Wireshark也使用pcapnetwork l ...

  3. HTTP 请求报文和响应报文分析和解刨!!

    http请求和响应报文分析 一>http请求报文主要包括三个部分:1.请求行:2.请求头:3;请求体: 1,请求行一般包括三个部分:请求方式:请求url : http协议版本. 请求方法:大部分 ...

  4. http协议请求报文与响应报文分析

    什么是HTTP协议: HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到 不断地完善和扩展.目前在WWW中使用 ...

  5. Wireshark安装使用及报文分析

    先看链接!!! Wireshark使用教程:https://jingyan.baidu.com/article/93f9803fe902f7e0e56f5553.html Wireshark过滤规则筛 ...

  6. Spring源码分析之`BeanFactoryPostProcessor`调用过程

    前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 本文内容: AbstractApplicationContext#refresh前部分的一点小内容 ...

  7. Atitit main函数的ast分析  数组参数调用的ast astview解析

    Atitit main函数的ast分析  数组参数调用的ast astview解析 1.1. Xxcls.main(new String[]{"","bb"}) ...

  8. python通过http请求发送soap报文进行webservice接口调用

    最近学习Python调用webservice 接口,开始的时候主要采用suds 的方式生产client调用,后来发现公司的短信接口采用的是soap报文来调用的,然后开始了谷歌,最后采用httplib ...

  9. 【协议】AAA Radius协议的常用报文分析

    写在前面的话 RADIUS:Remote Authentication Dial In User Service,远程用户拨号认证系统由RFC2865,RFC2866定义,是应用最广泛的AAA协议. ...

随机推荐

  1. HTML5【语法要点】

    一.头部设置 <!--页面窗口自动调整到设备宽度,并禁止用户及缩放页面--> <meta name="viewport" content="width= ...

  2. [Java入门笔记] Java语言基础(一):注释、标识符与关键字

    注释 什么是注释? 注释是我们在编写代码时某段代码.某个方法.某个类的说明文字,方便大家对于代码的阅读.被注释的内容不会被编译.执行. Java的注释分为三种类型:单行注释.多行注释.文档注释. 单行 ...

  3. rawurlencode / urlencode

    rawurlencode遵守是94年国际标准备忘录RFC 1738,urlencode实现的是传统做法,和上者的主要区别是对空格的转义是'+'而不是'%20' 推荐在PHP中使用用rawurlenco ...

  4. Nodejs以后台服务启动

    1: 从网上查找  LINUX中我们可以使用这种简单的方式让node.js在后台运行: nohup node your_app.js & 经多次实验一直没有成功   2:使用 forever ...

  5. Java公众号推荐 - BeJavaGod

    今天新创建了一个java的公众号,会经常更新java的文章,有兴趣的朋友关注一下吧- 主要内容基本是跟本微博同步的 不管是做java的新手还是高手,内行还是外行,java还是非java,一起关注,一起 ...

  6. NYOJ 743

    复杂度 描述 for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) for(k=j+1;k<=n;k++) operation; 你知道 operation 共 ...

  7. IdentityHashMap类:增加相同Key(键)内容的结果

    正常Map操作中,key是不能重复的. 先看使用HashMap()操作,增加相同Key内容的结果: 先看代码: package 类集; import java.util.HashMap; import ...

  8. httpd安装.md

    httpd 简介 httpd是由apache软件基金会开发的一款著名的web服务器软件.由于其开放源代码,并且拥有跨平台.功能强大.安全稳定等特性,而被广泛使用.早期httpd是在修修补补的基础上成长 ...

  9. iOS widget开发

    链接: iOS Widget开发 iOS开发之构建Widget iOS开发Widget iOS开发-widget基础 ios8新特性widget开发 ios 10 开发-widget实现 Widget ...

  10. iOS重一些常用的代理模式

    (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和proto ...