【WCF--初入江湖】06 WCF契约服务行为和异常处理
06 WCF契约服务行为和异常处理
一、WCF契约服务行为
【2】分类
WCF的行为分为两类:
服务行为(Service Behavior)
操作行为(Operation Behavior)
【3】应用的位置
应用在实现接口的类上,而不是接口上。
[ServiceBehavior]
public class ServiceClass:IService1
{
[OperationBehavior]
public int AddNumber(int x,int y)
{
return x+y;
}
【4】服务的行为配置有两种方式:
【4-1】使用代码配置
示例:在宿主中,使用
ServiceHost的Description.Behaviors.Add()方法
//地址
Uri pipeaddress = new Uri("net.pipe://localhost/NetNamedPipeBinding");
Uri tcpaddress = new Uri("net.tcp://localhost:8088/TcpBinding");
。。。
//服务宿主对象
host = new ServiceHost(typeof(WcfServiceLibrary1.Service1), pipeaddress, tcpaddress);
。。。
//添加元数据 行为
ServiceMetadataBehavior mBehavior = new ServiceMetadataBehavior();
host.Description.Behaviors.Add(mBehavior);
或者是:
[ServiceBehavior]
public class ServiceClass:IService1
{
[OperationBehavior]
public int AddNumber(int x,int y)
{
return x+y;
}
[OperationBehavior]
public int SubtractNumber(int x,int y)
{
return x-y;
}
}
【4-2】使用配置文件配置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="WcfServiceLibrary1.Service1" behaviorConfiguration="textBehavior">
。。。。。。
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="textBehavior">
<serviceMetadata/>
<serviceDebug/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
【5】[ServiceBehavior]的属性
AutomaticSessionShutdown 客户端关闭会话时服务是否自动关闭
ConcurrencyMode 线程的支持,默认:服务是单线程
IgnoreExtensionDataObject 跟序列化有关
IncludeExceptionDetaillnFaults 如何处理未被处理的异常
InstanceContextMode 服务实例对象创建的模式,PerCall 表示每次来一个请求为其创建一个对象的实例,调用后回收;PerSession是每次一个请求来只创建一个该服 务对象的实例直至其销毁,调用后进行回收,并且会话间不能共享; Single表示只允许创建一个该服务的实例,调用后不回收
ReleaseServiceInstanceOnTransactionComplete
TransactionAutoCompleteOnSessionClose
TransactionlsolationLevel
TtansactionTimeout
AutoDisposeParameters
ReleaseInstanceMode 操作完后回收对象、调用操作前回收、根据自动方式回收
TransactionAutoComplete 使用自动提交事务,默认为true
一个配示例:
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="unity" type="ByteartRetail.Infrastructure.UnityExtensions.UnityBehaviorExtensionElement, ByteartRetail.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
<unity operationContextEnabled="true" instanceContextEnabled="true" contextChannelEnabled="true" serviceHostBaseEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
另一个:
<serviceBehaviors>
<behavior name="WcfService1.Service1Behavior">
<serviceAuthorization ></serviceAuthorization>
<serviceTimeouts/>
<serviceThrottling maxConcurrentCalls="" maxConcurrentInstances="" maxConcurrentSessions=""/>
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
二、异常处理
【1】种类:
FaultException 创建非类型化的错误,在服务端进行创建,然后用SOAP方式返回客户端
TimeoutException
FaultException异常:
#region 程序集 System.ServiceModel.dll, v4.0.0.0
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.ServiceModel.dll
#endregion using System;
using System.Runtime.Serialization;
using System.Security;
using System.ServiceModel.Channels; namespace System.ServiceModel
{
// 摘要:
// 用于在客户端应用程序中捕获通过协定方式指定的 SOAP 错误。
//
// 类型参数:
// TDetail:
// 可序列化错误详细信息类型。
[Serializable]
public class FaultException<TDetail> : FaultException
{
// 摘要:
// 初始化使用指定详细信息对象的 System.ServiceModel.FaultException<TDetail> 类的新实例。
//
// 参数:
// detail:
// 用作 SOAP 错误详细信息的对象。
public FaultException(TDetail detail);
//
// 摘要:
// 将流反序列化为 System.ServiceModel.FaultException 对象时,使用指定的序列化信息和上下文初始化 System.ServiceModel.FaultException<TDetail>
// 类的新实例。
//
// 参数:
// info:
// 从 context 中重新构造 System.ServiceModel.FaultException 对象时必需的序列化信息。
//
// context:
// 从中重新构造 System.ServiceModel.FaultException 对象的流。
protected FaultException(SerializationInfo info, StreamingContext context);
//
// 摘要:
// 初始化使用指定详细信息对象和错误原因的 System.ServiceModel.FaultException<TDetail> 类的新实例。
//
// 参数:
// detail:
// 用作 SOAP 错误详细信息的对象。
//
// reason:
// SOAP 错误的原因。
public FaultException(TDetail detail, FaultReason reason);
//
// 摘要:
// 初始化使用指定详细信息和错误原因的 System.ServiceModel.FaultException<TDetail> 类的新实例。
//
// 参数:
// detail:
// 用作 SOAP 错误详细信息的对象。
//
// reason:
// SOAP 错误的原因。
public FaultException(TDetail detail, string reason);
//
// 摘要:
// 初始化 System.ServiceModel.FaultException<TDetail> 类的新实例,该类使用指定的详细信息对象、错误原因和错误代码。
//
// 参数:
// detail:
// 用作 SOAP 错误详细信息的对象。
//
// reason:
// SOAP 错误的原因。
//
// code:
// SOAP 错误的错误代码。
public FaultException(TDetail detail, FaultReason reason, FaultCode code);
//
// 摘要:
// 初始化 System.ServiceModel.FaultException<TDetail> 类的新实例,该类使用指定的详细信息对象、错误原因和错误代码。
//
// 参数:
// detail:
// 用作 SOAP 错误详细信息的对象。
//
// reason:
// SOAP 错误的原因。
//
// code:
// SOAP 错误的错误代码。
public FaultException(TDetail detail, string reason, FaultCode code);
//
// 摘要:
// 初始化 System.ServiceModel.FaultException<TDetail> 类的新实例,该类使用指定的详细信息对象以及 SOAP
// 错误原因、代码和操作值。
//
// 参数:
// detail:
// 用作 SOAP 错误详细信息的对象。
//
// reason:
// SOAP 错误的原因。
//
// code:
// SOAP 错误的错误代码。
//
// action:
// SOAP 错误的操作。
public FaultException(TDetail detail, FaultReason reason, FaultCode code, string action);
//
// 摘要:
// 初始化 System.ServiceModel.FaultException<TDetail> 类的新实例,该类使用指定的详细信息对象以及 SOAP
// 错误原因、代码和操作值。
//
// 参数:
// detail:
// 用作 SOAP 错误详细信息的对象。
//
// reason:
// SOAP 错误的原因。
//
// code:
// SOAP 错误的错误代码。
//
// action:
// SOAP 错误的操作。
public FaultException(TDetail detail, string reason, FaultCode code, string action); // 摘要:
// 获取包含错误条件详细信息的对象。
//
// 返回结果:
// System.ServiceModel.FaultException<TDetail> 对象的类型参数的详细信息对象。
public TDetail Detail { get; } // 摘要:
// 创建一个 System.ServiceModel.Channels.MessageFault 对象,该对象可用于创建表示 SOAP 错误的 System.ServiceModel.Channels.Message。
//
// 返回结果:
// 创建的错误消息。
public override MessageFault CreateMessageFault();
//
// 摘要:
// 实现在将对象序列化到流中时调用的 System.Runtime.Serialization.ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)
// 方法。
//
// 参数:
// info:
// 序列化时向其添加对象数据的序列化信息。
//
// context:
// 序列化对象的目标。
[SecurityCritical]
public override void GetObjectData(SerializationInfo info, StreamingContext context);
//
// 摘要:
// 返回 System.ServiceModel.FaultException<TDetail> 对象的字符串。
//
// 返回结果:
// SOAP 错误的字符串。
public override string ToString();
}
}
服务端:
public class Service1 : IService1
{
public void Divide(int x, int y)
{
try
{
int z = x / y;
}
catch(Exception e)
{
throw new FaultException("试图除零",new FaultCode("除法操作"));
}
}
}
客户端:
server.Service1Client client = new wcfClient.server.Service1Client(); try
{
client.Divide(, );
client.Abort();
client.Divide(, );
}
catch (FaultException fe)
{
MessageBox.Show(fe.Reason.ToString());
}
catch (TimeoutException te)
{
MessageBox.Show("调用超时");
}
catch (CommunicationException ce)
{
MessageBox.Show("通信异常!");
}
【2】FaultContract:自定义错误信息:FaultData
// 摘要:
// 指定服务操作遇到处理错误时返回的一个或多个 SOAP 错误。
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
public sealed class FaultContractAttribute : Attribute
使用步骤:
第一步:
[ServiceContract(Namespace = "http://www.Keasy5.com")]
public interface IOrderService
{
[OperationContract]
[FaultContract(typeof(FaultData))]
int GetShoppingCartItemCount(Guid userID);
FaultData.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel; namespace Keasy5.DataObject
{
/// <summary>
/// Represents the data to be transferred through the
/// network which contains the fault exception information.
/// </summary>
[DataContract]
public class FaultData
{
#region Public Properties
/// <summary>
/// Gets or sets the message of the fault data.
/// </summary>
[DataMember(Order = )]
public string Message { get; set; }
/// <summary>
/// Gets or sets the full message of the fault data.
/// </summary>
[DataMember(Order = )]
public string FullMessage { get; set; }
/// <summary>
/// Gets or sets the stack trace information of the fault exception.
/// </summary>
[DataMember(Order = )]
public string StackTrace { get; set; }
#endregion #region Public Static Methods
/// <summary>
/// Creates a new instance of <c>FaultData</c> class from the specified <see cref="System.Exception"/> object.
/// </summary>
/// <param name="ex">The <see cref="System.Exception"/> object which carries the error information.</param>
/// <returns>A new instance of <c>FaultData</c> class.</returns>
public static FaultData CreateFromException(Exception ex)
{
return new FaultData
{
Message = ex.Message,
FullMessage = ex.ToString(),
StackTrace = ex.StackTrace
};
}
/// <summary>
/// Creates a new instance of <see cref="FaultReason"/> class from the specified <see cref="Exception"/> object.
/// </summary>
/// <param name="ex">The <see cref="System.Exception"/> object which carries the error information.</param>
/// <returns>A new instance of <see cref="FaultReason"/> class.</returns>
public static FaultReason CreateFaultReason(Exception ex)
{
return new FaultReason(ex.Message);
}
#endregion
}
}
第二步:
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“OrderService”。
// 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 OrderService.svc 或 OrderService.svc.cs,然后开始调试。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class OrderService : IOrderService
{
private readonly IOrderService orderServiceImpl = ServiceLocator.Instance.GetService<IOrderService>();
public Int32 GetShoppingCartItemCount(Guid userID)
{
try
{
return orderServiceImpl.GetShoppingCartItemCount(userID);
}
catch (Exception ex)
{
throw new FaultException<FaultData>(FaultData.CreateFromException(ex), FaultData.CreateFaultReason(ex));
}
}
使用了这个构造函数:
//
// 摘要:
// 初始化使用指定详细信息对象和错误原因的 System.ServiceModel.FaultException<TDetail> 类的新实例。
//
// 参数:
// detail:
// 用作 SOAP 错误详细信息的对象。
//
// reason:
// SOAP 错误的原因。
public FaultException(TDetail detail, FaultReason reason);
【WCF--初入江湖】06 WCF契约服务行为和异常处理的更多相关文章
- [SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端
原文:[SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端 之前开发基于WinForm监控的软件,服务端基于Wcf实现,里面涉及双工模式,在客户端里面,采用心跳包机制保持与服 ...
- WCF开发指南之构建服务
一. 引言 Windows通讯基础(简称为WCF)是一种SDK,用于让你使用典型的CLR编程结构(例如用于发布和消费服务的类和接口等)来构建Windows面向服务的应用程序.WCF的编程模型是声明性的 ...
- 关于WCF的引用,添加服务和添加web服务的区别
原文:关于WCF的引用,添加服务和添加web服务的区别 本章内容主要是根据我做的实验来阐述这2种添加服务针对WCF的不同之处,我们按照示例一步一步来看. 如下是工程的结构: 该WCF服务是通过控制台程 ...
- 使用WCF Data Service 创建OData服务
使用WCF Data Service 创建OData服务 在 上一章 中,介绍了如何通过 OData 协议来访问 OData 服务提供的资源.下面来介绍如何创建一个 OData 服务.在这篇文章中,主 ...
- WCF入门(十)——服务对象模型
当发生一次WCF请求-响应操作时,会经过如下几个步骤 WCF Client想WCF Server发送一个服务请求 WCF Server创建WCF服务对象 WCF Server调用WCF服务对象接口,将 ...
- 【WCF】WCF 附录 高级主题 配置服务配额设置
微软产品自带一个“默认安全”方案.这也包括了WCF,意味着WCF中的多种配置可以设置来阻止诸如DOS(拒绝服务访问)攻击.微软为很多基于一个单一计算机的开发环境选择这样的设置.这也意味着默认设置中的一 ...
- 【WCF 1】WCF框架宏观了解
导读:使用WCF框架爱开发项目也有很长一段时间了,最开始的时候,是理解的不深,所以不写博客进行总结.后来是项目赶,发现需要总结的有很多,一直没有把WCF排上日程,尤其是最近研究EF这一块,更是研究了一 ...
- WCF入门一[WCF概述]
一.什么是WCF WCF是使用托管代码建立和运行面向服务(Service Oriented)应用程序的统一框架.它使得开发者能够建立一个跨平台的.安全.可信赖.事务性的解决方案,且能与已有系统兼容协作 ...
- WCF学习笔记——WCF基础
一 WCF与SOA SOA是一种通过为所有软件提供服务外观,并将这些服务的WSDL集中发布到一个地方的一种组织企业软件的方法.它通过使用明确定义的接口通过跨越边界传递消息来让多个自治的服务协同工作.S ...
随机推荐
- .Net的基础概念
1,参数传递. 默认都是按值传递(无论引用还是值类型),也就意味着传递参数的一个副本给方法.之后在方法体内对参数的更改,对原始参数没有影响. 使用ref/out可以按引用传递,直接影响原始参数变量.两 ...
- springMvc(三)session、HandlerInterceptorAdapter
仅供参考 设置session值,根据自己的需求设置值 /** * 登入验证 * * @return */ @RequestMapping(value = "/loginCheck.htm&q ...
- Win7中隐藏的上帝模式——GodMode
Win7中隐藏的上帝模式——GodMode ~ Windows7中的隐藏模式 ~ 随意新建一个文件夹吧,然后重命名为: GodMode.{ED7BA470-8E54-465E-825C-997 ...
- 配置drbd高可用集群
前期准备: 同步时间 (两个节点) 节点一(172.16.21.6) [root@stu21 heartbeat2]# ntpdate 172.16.0.1 31 Dec 20:59:25 ntpda ...
- WP开发笔记——不同Item显示不同ApplicationBar:适用于Pivot与Panorama
一.在xaml页面定义两个ApplicationBar: <phone:PhoneApplicationPage.Resources> <shell:ApplicationBar I ...
- WINDOWS下更改MYSQL数据路径(datadir)后服务启动1067解决不能改变mysql数据库存储位置
晚上安装完MYSQL(系统:深度WINXPSP2, MYSQL版本:5.1.32)后,用MYSQL自带的配置工具配置完发现默认的数据存放路径是:C:/Documents and Settings/Al ...
- 两个Activity之间的交互startActivityForResult的使用
代码如下: package com.zzw.teststartintentforrequest; import android.app.Activity; import android.content ...
- Laravel 5 基础(三)- 向视图传送数据(续)
我们不仅仅可以向视图传送一个数据,同样我们可以传送Array public function about() { return view('pages.about')->with([ 'firs ...
- WPF编译时提示“...不包含适合于入口点的静态‘Main’方法 ...”
今天看了一下wpf的Application类方面的知识,一个windows应用程序由一个Application类的实例表示,该类跟踪在应用程序中打开的所有窗口,决定何时关闭应用程序(属性 Shutdo ...
- java 格式化日期(DateFormat)
import java.text.DateFormat; import java.util.Date; /** * 格式化时间类 DateFormat.FULL = 0 * DateFormat.DE ...