一段实现WEBSERVICE有状态的一段代码实现,请高手看看这样做的可行性?实现思路如下: WebService提供创建数据库连接和控制事务的方法,在创建SqlConnection的时候同时返回给客户端一个GUID,服务器端通过把该GUID作为Key将SqlConnection对象和SqlTransaction对象放到Session(要用[WebMethod(EnableSession = true)来使Session可用])或着Application中,通过有状态的WebService记住服务器端的状态。 具体代码如下所示:
[WebMethod(EnableSession=true)] public string CreateConnection() { string strGUID = Guid.NewGuid().ToString(); SqlConnection mySqlConnection = new SqlConnection(strConnString); Session[strGUID + "Connection"] = mySqlConnection; Common.JTLog.WriteEventLog("toby", Common.JTLog.LogType.Error, strGUID + "Connection"); return strGUID; } [WebMethod(EnableSession = true)] public void BeginTransaction(string strGUID) { SqlConnection mySqlConnection = (SqlConnection)Session[strGUID + "Connection"]; if (mySqlConnection.State == ConnectionState.Closed) { mySqlConnection.Open(); } SqlTransaction mySqlTransaction = mySqlConnection.BeginTransaction(); Session[strGUID + "Transaction"] = mySqlTransaction; } [WebMethod(EnableSession = true)] public void CommitTransaction(string strGUID) { SqlConnection mySqlConnection = (SqlConnection)Session[strGUID + "Connection"]; SqlTransaction mySqlTransaction = (SqlTransaction)Session[strGUID + "Transaction"]; mySqlTransaction.Commit(); if (mySqlConnection.State == ConnectionState.Open) { mySqlConnection.Close(); } } [WebMethod(EnableSession = true)] public void RollbackTransaction(string strGUID) { SqlConnection mySqlConnection = (SqlConnection)Session[strGUID + "Connection"]; SqlTransaction mySqlTransaction = (SqlTransaction)Session[strGUID + "Transaction"]; mySqlTransaction.Rollback(); if (mySqlConnection.State == ConnectionState.Open) { mySqlConnection.Close(); } } [WebMethod(EnableSession = true)] public int ExecuteNonQuery(string strGUID, string strCmdText) { SqlConnection mySqlConnection = (SqlConnection)Session[strGUID + "Connection"]; SqlTransaction mySqlTransaction = (SqlTransaction)Session[strGUID + "Transaction"]; SqlCommand objSqlCommand = new SqlCommand(strCmdText); objSqlCommand.Connection = mySqlConnection; objSqlCommand.Transaction = mySqlTransaction; return objSqlCommand.ExecuteNonQuery(); }
如果用Session保存状态的话,那客户端一定要通过myService.CookieContainer = new System.Net.CookieContainer();创建一个CookieContainer 来关联Session,如果使用Application对象保存的话就没有必要了。 客户端代码如下:
static void Main(string[] args) { TransactionService.Service myService = new TestProject.TransactionService.Service(); myService.CookieContainer = new System.Net.CookieContainer(); string strGUID = myService.CreateConnection(); try { myService.BeginTransaction(strGUID); myService.ExecuteNonQuery(strGUID, "update ATMAccount set Amount = 1000"); myService.ExecuteNonQuery(strGUID, "insert into ATMLog(AccountNumber,OperationType) values ('888', 'good')"); myService.CommitTransaction(strGUID); } catch(Exception ex) { myService.RollbackTransaction(strGUID); } }
但是这样做会不会在性能方面或者其他方面有什么问题,还希望大家一起讨论一下,给出好的建议。
[WebMethod(EnableSession=true)] public string CreateConnection() { string strGUID = Guid.NewGuid().ToString(); SqlConnection mySqlConnection = new SqlConnection(strConnString); Session[strGUID + "Connection"] = mySqlConnection; Common.JTLog.WriteEventLog("toby", Common.JTLog.LogType.Error, strGUID + "Connection"); return strGUID; } [WebMethod(EnableSession = true)] public void BeginTransaction(string strGUID) { SqlConnection mySqlConnection = (SqlConnection)Session[strGUID + "Connection"]; if (mySqlConnection.State == ConnectionState.Closed) { mySqlConnection.Open(); } SqlTransaction mySqlTransaction = mySqlConnection.BeginTransaction(); Session[strGUID + "Transaction"] = mySqlTransaction; } [WebMethod(EnableSession = true)] public void CommitTransaction(string strGUID) { SqlConnection mySqlConnection = (SqlConnection)Session[strGUID + "Connection"]; SqlTransaction mySqlTransaction = (SqlTransaction)Session[strGUID + "Transaction"]; mySqlTransaction.Commit(); if (mySqlConnection.State == ConnectionState.Open) { mySqlConnection.Close(); } } [WebMethod(EnableSession = true)] public void RollbackTransaction(string strGUID) { SqlConnection mySqlConnection = (SqlConnection)Session[strGUID + "Connection"]; SqlTransaction mySqlTransaction = (SqlTransaction)Session[strGUID + "Transaction"]; mySqlTransaction.Rollback(); if (mySqlConnection.State == ConnectionState.Open) { mySqlConnection.Close(); } } [WebMethod(EnableSession = true)] public int ExecuteNonQuery(string strGUID, string strCmdText) { SqlConnection mySqlConnection = (SqlConnection)Session[strGUID + "Connection"]; SqlTransaction mySqlTransaction = (SqlTransaction)Session[strGUID + "Transaction"]; SqlCommand objSqlCommand = new SqlCommand(strCmdText); objSqlCommand.Connection = mySqlConnection; objSqlCommand.Transaction = mySqlTransaction; return objSqlCommand.ExecuteNonQuery(); }
如果用Session保存状态的话,那客户端一定要通过myService.CookieContainer = new System.Net.CookieContainer();创建一个CookieContainer 来关联Session,如果使用Application对象保存的话就没有必要了。 客户端代码如下:
static void Main(string[] args) { TransactionService.Service myService = new TestProject.TransactionService.Service(); myService.CookieContainer = new System.Net.CookieContainer(); string strGUID = myService.CreateConnection(); try { myService.BeginTransaction(strGUID); myService.ExecuteNonQuery(strGUID, "update ATMAccount set Amount = 1000"); myService.ExecuteNonQuery(strGUID, "insert into ATMLog(AccountNumber,OperationType) values ('888', 'good')"); myService.CommitTransaction(strGUID); } catch(Exception ex) { myService.RollbackTransaction(strGUID); } }
但是这样做会不会在性能方面或者其他方面有什么问题,还希望大家一起讨论一下,给出好的建议。
解决方案 »
- [求助]动态绑定lookupedit的数据源
- 紧急求问 关于入门
- 如何将C# 的DATASET 直接写入(Insert)Oracle?
- [求助]IE地址栏前换成自己的图标代码怎么用?
- 请教怎样使用C#控制Excel组合行
- an unexpected error has occurred
- 如何获取DataGridViewCheckBoxColumn 的状态
- =====C#.net的dataGrid的Columnstyle怎么不多自带几种风格?有好一点的解决办法吗?敬请指教,来者有分。================
- TextBox继承问题
- 向高手求救,在线等待,关于事件的问题!!!!!!!!!!!!!!
- c#做的管理系统出现的问题,帮忙解决下吧,我快纠结死了
- 怎样在自己的登录窗口上验证QQ密码是否正确?
建议你去看看WCF.
晕,我这段代码是讨论SESSION存放SQLCONNECTION的可行性,跟客户端身份验证有什么关系?