WCF 入门 (16)
前言
上周回母校见了一下大学老师,还有些同学,发现差距还是挺大的。。。圈子不一样,真的就什么都不一样了。。
第16集 WCF中的Soap错误 Soap faults in WCF
首先简单介绍一下什么是Soap。
Soap全称Simple Object Access Protocol, 简单对象访问协议,他是一种交换数据的协议规范,是一种轻量的、简单的、基于xml的协议,它被设计成在WEB上交换结构化的和固化的信息。
因为异常是不允许通过WCf的service channel 发送给客户端的,所以,服务端把Exception序列化为Soap格式的信息,然后发送给客户端。
关于Service channel, 查了一下,大概是这么个定义。有句话是这么说的:
The main goal of Channel is to transform message to format understandable by the communication wire and compatible to both server and client and then transport the message over the wire in between client and server.
XML格式的Soap faults 和平台无关,一个典型的SOAP错误信息包含以下几个方面。
- FaultCode
- FaultReason
- Detail elements 等。
以后的视频会着重讲一下这个Detail elements。
SOAP faults基于两种格式,SOAP 1.1 和SOAP 1.2, 两者的文档在这里,可以看看。在WCF中,如果bingding是BasicHttpBinding,就用1.1, 其他的WCF内置bingding用1.2.
我们先根据第九集的内容启用WCF的日志记录功能,然后在客户端调用服务,会生成一个svclog文件,双击打开,选择item,就可以看到具体的log message。
打开之后出了点小插曲,报了下面的错误:
The trace record is not correct and cannot be loaded. This might be caused by one of the following reasons:
record不能被加载,看了一下内容,xml格式不完整,顺手谷歌了一下,(先试验bing,没找出来,然后百度试了一下,也不行)不的不说,谷歌真的nb。
解决方案是在<system.diagnostics>的节点下加上一个<trace autoflush=”true”/>,如下图:
打开之后可以看最后一个,是个response, 倒数第二个是request。
由图可以看到faultcode,faultstring(因为我们用的basicHttpBinding,所以是soap1.1,所以是faultstring,如果是其他bingding,就是faultreason),detail都有了(如果没有启用includeExceptionDetailInFaults=true,那么就看不到detail)。
然后来试验一下其他bingding,比如wsHttpBinding(这个以后会着重讲)。
首先是服务端的修改:把basicHttpBinding改成wsHttpBingding
还要设置bingding的security mode = none, 因为对于wsHttpBingding,这个默认是打开的,简而言之,非明文传输的。
然后rerun这个host
更新客户端的服务引用
结束之后会发现,客户端的配置文件里面的binding也变成了wsHttpBinding
再次调用,然后打开svclog,看到如下结果:
这样,就什么都有了。
这集介绍了fault message在soap1.1 和1.2 下的不同表现。
Thank you!