科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件基于Windows通讯基础的事务性服务创建

基于Windows通讯基础的事务性服务创建

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

WCF的核心目的是帮助你构建基于.NET的安全可靠的和事务性的服务

作者:朱先忠编译 来源:天极开发 2007年11月4日

关键字: Windows 通讯 事务性服务

  • 评论
  • 分享微博
  • 分享邮件
阅读提示 今天,事务不再仅适用于数据库应用程序。通过使用Windows Communication Foundation(Windows通讯基础,简写为WCF)中的统一事务系统,你不仅可以为数据库应用程序创建事务性服务,也可以为发送消息、工作流以及其它类型的应用程序创建事务性服务。

   WCF的核心目的是帮助你构建基于.NET的安全可靠的和事务性的服务。在本文中,你将会在前两篇代码基础上进行构建以创建你的第一个事务性服务。

  一、WCF中的事务

  事务能够确保一组相关的操作以一个原子单元的方式发生。换句话说,在该单元中的每个操作必须都成功或都失败。WCF提供了一个集中的事务系统-你可以用来管理你的事务操作。在过去,事务逻辑通常用作一个标准方法来管理数据库事务(还记得VB中的BeginTrans和CommitTrans吗?),但是不存在标准方法来执行非数据库事务。WCF的目标就是用一个统一事务系统来解决这个问题-你可以应用于数据库、通讯或其它的事务性行为中。

  WCF编程模型使得事务易于使用。为此,你要把一组操作组织成一个事务范围。这个范围定义了一个事务的原子。下列伪代码说明了这一点:

Using(TransactionScope theScope = new
TransactionScope())
{
Service1.submitRequest(myRequest);
Service2.submitRequest(myOtherRequest);
Service3.submitRequest(myFinalRequest);
theScope.Complete();
}

  二、构建你的第一个可事务化的服务

  一开始,你首先需要一个事务性的服务。这就意味着你愿意让你的服务参予一个在你的契约操作上的由客户初始化的事务,由你来指定(使用属性和配置文件)该事务的行为。在构建该服务后,你将逐步分析构建一个客户-在调用该服务时它使用一事务范围。如果你已经安装了Visual Studio.NET,那么你应该很快就能够运行起来。

  让我们首先用Visual Studio.NET创建一新的Web站点。然后,选择IndigoService工程类型并且把它命名为Tservice。你的屏幕应该看上去如图1所示。


图1.创建一新的Indigo服务:在选择Indigo服务工程类型并命名其为Tservice后,你的屏幕看上去的样子。

  Visual Studio将用一个称为IMyService的接口为你创建一个缺省的服务和一个称为MyService的服务类。你将在App_Code子文件夹下的Service.cs文件中找到该服务类的代码。你可以用显示在列表1中的代码来代替在这个文件中的代码。你还将需要添加一个到System.Transactions命名空间的参考引用-以便在你编译它时,代码能够正确工作。

  列表1.可事务化的Web服务:

//这个Web服务与在前一篇文章中所描述的TemperatureService相同,
//但是这个版本包含了使该服务成为事务性的属性.
using System;
using System.ServiceModel;
using System.Transactions;
[ServiceContract(Namespace = "http://Devx.Indigo.Transactions")]
public interface ITransactableTemperatures
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Required)]
double ftoc(double f);
[OperationContract]
[TransactionFlow(TransactionFlowOption.Required)]
double ctof(double c);
}
[ServiceBehavior(TransactionIsolationLevel =
IsolationLevel.ReadCommitted)]
public class TransactableTemperatures : ITransactableTemperatures
{
[OperationBehavior(TransactionScopeRequired = true,
TransactionAutoComplete = true)]
public double ftoc(double f)
{
double dReturn = 0.0;
dReturn = ((f - 32) * 5) / 9;
return dReturn;
}
[OperationBehavior(TransactionScopeRequired = true,
TransactionAutoComplete = true)]
public double ctof(double c)
{
double dReturn = 0.0;
dReturn = ((c + 32) * 9) / 5;
return dReturn;
}
}

  注意,该事务性Web服务的代码等同于以前文章中的"温度"Web服务-用一些新的属性把它描述为事务性的。

  当在接口级上定义方法时,OperationContract的属性被用[TransactionFlow]属性加以修饰。这可以通知运行时刻在OperationContract上的操作存在疑问时如何在一个事务条件下作出响应。其有效值为Allowed-当操作可以或不可以用于一个事务中时;而当永不会用于一个事务中时它取值为NotAllowed;当必须在一个事务范围内使用时,它取值为Required。

  在服务级上,[ServiceBehavior]属性通过使用TransactionIsolationLevel属性来指定事务的属性。理想情况下,事务应该展示四个关键属性-atomic,consistent,isolated和durable,缩略词为ACID。然而,保持它们之间彼此完全相互隔离可以使得持有资源锁的时间比必需的时间更长些-这可能导致锁竞争、降低性能甚至导致死锁条件-此时,不同的事务彼此都需要锁来完成自身而该锁却由另外的事务持有。设置隔离级别让你选择最匹配于其它应用程序的隔离程度。你可以通过把IsolationLevel属性值设置为ServiceBehavior的TransactionIsolationLevel属性值来设置隔离级别。在列表1中,IsolationLevel被设置为ReadCommited-这意味着在该事务中不能读取volatile型数据,但是能被修改。要全面地了解不同的隔离级别属性值,你可以参考帮助文档中的System..Transactions.IsolationLevel枚举。注意,还有一个枚举System.Data.IsolationLevel;因此,如果你在代码中参考System.Data命名空间,那么你必须以完全限定方式来使用这个IsolationLevel以避免冲突问题。

  最后,列表1使用[OperationBehavior]属性定义了在服务中的Web方法中的事务行为-它把自己的TransactionScope属性设置为true。这个TransactionScope设置指明必须在某一范围内调用该操作(这将在客户内部展示出来)。TransactionAutoComplete属性也被设置为true来指示当方法完成执行时,将把该事务标志为complete。如果TransactionAutoComplete属性被设置为false,那么你将调用OperationContext.Current.SetTransactionComplete()方法来手工设置该事务的正确完成;否则,该事务将标志其为失败的。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章