对Web
HTTP编程模型来说,服务契约中当操作的方式毫无应用OperationContractAttribute特性,只待根据需要使用WebGetAttribute与WebInvokeAttribute特性即可。前者针对GET
HTTP方法,或者虽对其他HTTP方法。WebGetAttribute与WebInvokeAttribute的属性BodyStyle和IsBodyStyleSetExplicitly涉及到“Web消息主体风格”的话题。

   1: [AttributeUsage(AttributeTargets.Method)]

   2: public sealed class WebGetAttribute : Attribute, IOperationBehavior

   3: {

   4:     //其他成员

   5:     public WebMessageBodyStyle BodyStyle { get; set; }

   6: }

   7:  

   8: [AttributeUsage(AttributeTargets.Method)]

   9: public sealed class WebInvokeAttribute : Attribute, IOperationBehavior

  10: {

  11:     //其他成员

  12:     public WebMessageBodyStyle BodyStyle { get; set; }

  13: }

至于消息主体的品格通过拥有如下概念的枚举WebMessageBodyStyle表示。

   1: public enum WebMessageBodyStyle

   2: {

   3:     Bare,

   4:     Wrapped,

   5:     WrappedRequest,

   6:     WrappedResponse

   7: }

我们了解要消息以及死灰复燃消息分别是针对操作方法输入参数和返回值(输出参数与援参数)的包装,WebMessageBodyStyle中的Bare表示求消息和死灰复燃消息的中心部分单独包含对输入参数与返回值(输出参数和援参数)序列化后的始末,而Wrapped则会以外界包裹一个根据当前操作的“封套”。枚举项WrappedRequest和WrappedResponse用于单独对请求消息及死灰复燃消息之主体进行包装。

WebGetAttribute与WebInvokeAttribute的属性BodyStyle的默认值为Bare。如果该属性让安装成WrappedRequest,则回复消息主体还是采用Bare风格;如果该属性被装成WrappedResponse,则请消息主体还是采取Bare风格。布尔品种的只是念属性IsBodyStyleSetExplicitly表示是否针对属性BodyStyle进行了展示设置。

目录
一、Xml+Bare
二、Xml+Wrapped
三、JSON+Bare
四、JSON+Wrapped
五、Bare请求消息风格对单纯输入的限量
六、Bare回复信风格对单纯输出的范围

一、Xml + Bare

咱俩由此事先演示的实例来瞧针对不同之信格式(XML和JSON),请求消息以及死灰复燃消息之重心在应用不同风格的场面下有所何等的构造。现在我们本着使用在契约接口IEmployees中之Create操作方法上的WebInvokeAttribute进行了如下的改,即显式地指定了央消息和回复消息的格式(XML)和中心风格(Bare)。同时为以回来路从void编程了Employee,并直接用创造的Employee对象回来。

   1: [ServiceContract]

   2: public interface IEmployees

   3: {

   4:     //其他成员

   5:     [WebInvoke(UriTemplate = "/", Method = "POST", 

   6:     RequestFormat = WebMessageFormat.Xml, 

   7:     ResponseFormat = WebMessageFormat.Xml, 

   8:     BodyStyle = WebMessageBodyStyle.Bare)]

   9:     Employee Create(Employee employee);

  10: }

  11:  

  12: public class EmployeesService : IEmployees

  13: {

  14:     //其他成员

  15:     public Employee Create(Employee employee)

  16:     {

  17:         employees.Add(employee);

  18:         return employee;

  19:     }

  20: }

我们针对如下所显示之代码通过服务调用添加一个人名为“王五”的职工。

   1: using (ChannelFactory<IEmployees> channelFactory = new ChannelFactory<IEmployees>("employeeService"))

   2: {

   3:     IEmployees proxy = channelFactory.CreateChannel();

   4:     proxy.Create(new Employee

   5:     {

   6:         Id         = "003",

   7:         Name       = "王五",

   8:          Grade     = "G9",

   9:         Department = "行政部"

  10:     });           

  11: }

对如齐所展示之劳务调用,由于信息格式和核心风格分别吗Xml和Bare,所以当请求消息以及恢复消息的主心骨就是Employee对象被序列化后转的XML片断,具体内容如下所示。

   1: 请求消息主体:

   2: <Employee xmlns="http://www.artech.com/" 

   3:   xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

   4:   <Department>行政部</Department>

   5:   <Grade>G9</Grade>

   6:   <Id>003</Id>

   7:   <Name>王五</Name>

   8: </Employee>

   9:  

  10: 回复消息主体:

  11: <Employee xmlns="http://www.artech.com/" 

  12:   xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

  13:   <Department>行政部</Department>

  14:   <Grade>G9</Grade>

  15:   <Id>003</Id>

  16:   <Name>王五</Name>

  17: </Employee>

二、Xml + Wrapped

今昔我们针对契约接口略加修改,将使用在操作方法Create上的WebInvokeAttribute特性的特性BodyStyle设置也Wrapped。

   1: [ServiceContract]

   2: public interface IEmployees

   3: {

   4:     //其他成员

   5:     [WebInvoke(UriTemplate = "/", Method = "POST", 

   6:     RequestFormat = WebMessageFormat.Xml, 

   7:     ResponseFormat = WebMessageFormat.Xml, 

   8:     BodyStyle = WebMessageBodyStyle.Wrapped)]

   9:     Employee Create(Employee employee);

  10: }

针对同一之服务调用,请求消息以及恢复消息将有所如下所展示之主脑内容。我们得望Employee被序列化后转变的XML在求消息遭到作<Create>元素的子元素;对于回复消息吧,Employee为序列化后转的XML的根元素名称也CreateResult,而无是<Employee>,而全方位<CreateResult>内嵌于<
CreateResponse >元素中。

   1: 请求消息主体:

   2: <Create xmlns="http://tempuri.org/">

   3:   <employee xmlns:a="http://www.artech.com/" 

   4:         xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

   5:     <a:Department>行政部</a:Department>

   6:     <a:Grade>G9</a:Grade>

   7:     <a:Id>003</a:Id>

   8:     <a:Name>王五</a:Name>

   9:   </employee>

  10: </Create>

  11:  

  12: 回复消息主体:

  13: <CreateResponse xmlns="http://tempuri.org/">

  14:   <CreateResult xmlns:a="http://www.artech.com/" 

  15:         xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

  16:     <a:Department>行政部</a:Department>

  17:     <a:Grade>G9</a:Grade>

  18:     <a:Id>003</a:Id>

  19:     <a:Name>王五</a:Name>

  20:   </CreateResult>

  21: </CreateResponse>

三、JSON+ Bare

点我们透过实例演示了音格式为Xml情况下对不同风格的音讯主体的情节差异,现在我们随同等的法来谈谈当消息格式为JSON的时候,针对不同风格的音主体在结构上又富有哪些差异。如下面的代码片断所示,我们由此对契约接口的改以劳动操作Create的信息格式和重点风格设置成Json和Bare。

   1: [ServiceContract]

   2: public interface IEmployees

   3: {

   4:     //其他成员

   5:     [WebInvoke(UriTemplate = "/", Method = "POST", 

   6:     RequestFormat = WebMessageFormat.Json, 

   7:     ResponseFormat = WebMessageFormat.Json, 

   8:     BodyStyle = WebMessageBodyStyle.Bare)]

   9:     Employee Create(Employee employee);

  10: }

平对事先的服务调用,以JSON形式表示的Employee对象将直当做请求消息和死灰复燃消息的主导部分,具体的情节如下所示。(S1004)

   1: 请求消息主体:

   2: {"Department":"行政部","Grade":"G9","Id":"003","Name":"王五"}

   3:  

   4: 回复消息主体:

   5: {"Department":"行政部","Grade":"G9","Id":"003","Name":"王五"}

四、JSON+ Wrapped

我们最终来演示Json消息格式在Wrapped风格下所有何等的组织,为者我们一味待将用在Create操作方法上的WebInvokeAttribute特性的BodyStyle属性设置也Wrapped。

   1: [ServiceContract]

   2: public interface IEmployees

   3: {

   4:     //其他成员

   5:     [WebInvoke(UriTemplate = "/", Method = "POST", 

   6:     RequestFormat = WebMessageFormat.Json, 

   7:     ResponseFormat = WebMessageFormat.Json, 

   8:     BodyStyle = WebMessageBodyStyle.Wrapped)]

   9:     Employee Create(Employee employee);

  10: }

比方下面的代码所示,由于要消息和回复消息使Wrapped风格,表示Employee的JSON对象最终作为最后JSON对象的“employee”属性与“CreateResult”属性。(S1005)

   1: 请求消息主体:

   2: {"employee":{"Department":"行政部","Grade":"G9","Id":"003","Name":"王五"}}

   3:  

   4: 回复消息主体:

   5: {"CreateResult":{"Department":"行政部","Grade":"G9","Id":"003","Name":"王五"}}

五、Bare请求消息风格对纯粹输入的求

于Bare消息主体风格来说,意味着对象被序列化后别的XML或者JSON表示一直作为信息之重心,所以才适用于单纯对象。具体来说,只有具备唯一输入参数的操作方法才能够以请消息之主题风格设置为Bare。

   1: [ServiceContract(Namespace = "http://www.artech.com/")]

   2: public interface ICalculator

   3: {

   4:     [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare)]

   5:     double Add( double x,  double y);

   6: }

若是达到所显示之是咱们耳熟能详的精打细算服务的契约接口的概念。消息主体风格也Bare的操作方法Create具有两只输入参数(x和y),在针对落实了拖欠契约接口进行寄宿的时即便会见废弃来如下图所著之InvalidOperationException异常,提示“约定“ICalculator”的操作‘Add’指定要序列化多只请求正文参数,但从来不其他包装元素。如果没包装元素,至多可序列化一个正文参数。请去多余的正文参数,或用
WebGetAttribute/WebInvokeAttribute 的 BodyStyle 属性设置也
Wrapped”。

图片 1

六、Bare回复信息风格对纯粹输出的求

由复原参数是指向回值、引用参数与出口参数的卷入,所以当操作方法具有引用参数或者输出参数时未克拿回升消息之重头戏风格设置也Bare。

   1: [ServiceContract(Namespace = "http://www.artech.com/")]

   2: public interface ICalculator

   3: {    

   4:     [WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest)]

   5:     void Add( double x,  double y, out double result);

   6: }

平等为计算服务契约为例,现在咱们通过如达到之道以出口参数的样式返回加法运算的结果,并以采用在操作方法上的WebInvokeAttribute特性的BodyStyle属性设置也WrappedRequest,这意味要消息及恢复消息分别采取Wrapped和Bare风格。当我们针对落实了拖欠契约接口的服务设施寄宿时会扔来下图所著之InvalidOperationException异常,并提示“约定‘ICalculator’的操作‘Add’至少指定一个应正文参数不是操作的归值。当
WebGetAttribute/WebInvokeAttribute 的 BodyStyle 属性设置也 Bare
时,只允许采取返回值。请去多余的响应正文参数或以 BodyStyle 属性设置为
Wrapped”。

图片 2

作者:Artech
出处:http://artech.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意要保留这个段子声明,且在篇章页面明显位置被起原文连接,否则保留追究法律责任的权利。

 

相关文章

网站地图xml地图