|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
也许唯一可以让世人留恋Java的理由就剩下它的王牌——跨平台。web在WebService中完成Transaction
.NetFramework为类,WebForm和WebService供应了事件处置功效。
在传统的windows使用程序中,要写一个有事件处置功效的组件不但要写代码并且要在组件服务中创立一个事件包。这就意味着在任何一台要处置这个事件的呆板上,你都不能不翻开mmc在COM+使用程序节点下创立一个新包。
.NETFramework使得这统统变得很复杂,现实上我们不必在组件服务中作任何事,这统统都是主动完成的。对WebService来讲,.NETFramework用EnterpriseServices(COM+的替换者)来办理事件,而无需创立一个COM+包。一切办理事件形态的事情都是在幕后完成的。
在webservice中完成这个很复杂。
1)在[WebMethod()]属性中指定transaction的范例。如[WebMethod(false,TransactionOption.RequiresNew)]
以下是TransactionOption的具体列表。
TransactionOption.DisabledIgnoreanytransactioninthecurrentcontext.
TransactionOption.NotSupportedCreatethecomponentinacontextwithnogoverningtransaction.
TransactionOption.SupportedShareatransactionifoneexists;createanewtransactionifnecessary.
TransactionOption.RequiredCreatethecomponentwithanewtransaction,regardlessofthestateofthecurrentcontext.
TransactionOption.RequiresNewShareatransactionifoneexists.
2)用[AutoComplete]属性确保Transaction能完成,除非抛出非常。
由此我们能够看出在WebService中完成Transaction的一点特别性,即Transaction属性是使用于WebMethod上的。这意味着在webservice中只要设置了TransactionOption后才会使用事件。
注重:我们能够不要[AutoComplete],本人写代码完成事件或中断事件,例子以下
try
{
//Updatethebalances:
//IfanAccount.Balancegoesbelow0,
//anexceptionisthrownbytheAccountobject
_credit.Balance=_actDB.getBalance(_credit.ID);
_debit.Balance=_actDB.getBalance(_debit.ID);
ContextUtil.SetCommit;
}
//CatchtheexceptionfromtheAccountobject
catch(Exceptionex)
{
ContextUtil.SetAbort;
}
附上我的一段代码:
usingSystem;
usingSystem.Collections;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Diagnostics;
usingSystem.Web;
usingSystem.Web.Services;
usingSystem.EnterpriseServices;
namespaceMichael.WebServiceTrans
{
publicclassFinancialUtil:System.Web.Services.WebService
{
//Createaclass-levelinstanceoftheAccountDBclass
Michael.Data.AccountDB_actDB=newMichael.Data.AccountDB();
[WebMethod(false,TransactionOption.RequiresNew)]
[AutoComplete]
publicDecimal[]TransferMoney(Decimal_amount,
String_fromActNum,
String_toActNum)
{
Account_debit=newAccount(_fromActNum);
Account_credit=newAccount(_toActNum);
Decimal[]_array=newDecimal[2];
_actDB.debitOrCreditAccount(true,_credit.ID,_amount);
_actDB.debitOrCreditAccount(false,_debit.ID,_amount);
try
{_credit.Balance=_actDB.getBalance(_credit.ID);
_debit.Balance=_actDB.getBalance(_debit.ID);
}
catch(Exceptionex)
{
throw(newSystem.Exception(ex.Message));
}
//Returnthenewbalancesinthearray
_array[0]=_debit.Balance;
_array[1]=_credit.Balance;
return_array;
}
[WebMethod()]
publicDataSetGetAllAccountNumbers()
{
return_actDB.getAllAccountNums();
}
//******************************************************//
//***********VISUALSTUDIODESIGNERCODE**************//
//******************************************************//
publicFinancialUtil()
{
InitializeComponent();
}
#regionComponentDesignergeneratedcode
///<summary>
///RequiredmethodforDesignersupport-donotmodify
///thecontentsofthismethodwiththecodeeditor.
///</summary>
privatevoidInitializeComponent()
{
}
#endregion
protectedoverridevoidDispose(booldisposing)
{
}
}
}
c语言的编译器,几乎是所有新平台都有的。因此从这点上看,c语言的程序,比其他任何语言更加容易跨平台。 |
|