wcf中事务的操作
using System; using System.ServiceModel; namespace Larryle.Wcf.ServiceContract.Transaction { [ServiceContract] public interface IHello { [OperationContract] [TransactionFlow(TransactionFlowOption.Mandatory)] void WriteHello(string name); } }
using System; using System.ServiceModel; namespace Larryle.Wcf.ServiceContract.Transaction { [ServiceContract] public interface IHi { [OperationContract] [TransactionFlow(TransactionFlowOption.Mandatory)] void WriteHi(string Name); } }
using System; using System.Collections.Generic; using System.ServiceModel; using Larryle.Wcf.ServiceContectData.Transaction; namespace Larryle.Wcf.ServiceContract.Transaction { [ServiceContract] public interface IResult { [OperationContract] List<Item> GetResult(); } }
using System; using System.Linq; using System.ServiceModel; using Larryle.Wcf.ServiceContract.Transaction; using Larryle.Wcf.ServiceContectData.Transaction; namespace Larryle.Wcf.Service.Transaction { public class Hello : IHello { [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] public void WriteHello(string name) { DBDataContext ctx = new DBDataContext(); ctx.Item.InsertOnSubmit(new Item { Title = string.Format("Hello:{0},TransactionId:{1}", name, System.Transactions.Transaction.Current.TransactionInformation.LocalIdentifier), CreatedTime = DateTime.Now }); ctx.SubmitChanges(); } } }
using System; using System.ServiceModel; using Larryle.Wcf.ServiceContectData.Transaction; using Larryle.Wcf.ServiceContract.Transaction; namespace Larryle.Wcf.Service.Transaction { public class Hi : IHi { [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] public void WriteHi(string Name) { if (DateTime.Now.Second % 2 == 0) { throw new System.Exception("为测试事务而抛出的异常"); } DBDataContext dbcx = new DBDataContext(); dbcx.Item.InsertOnSubmit(new Item { Title = string.Format("Hi:{0},TransactionId:{1}",Name,System.Transactions.Transaction.Current.TransactionInformation.LocalIdentifier), CreatedTime=DateTime.Now }); dbcx.SubmitChanges(); } } }
using System; using System.Linq; using System.ServiceModel; using Larryle.Wcf.ServiceContectData.Transaction; using Larryle.Wcf.ServiceContract.Transaction; namespace Larryle.Wcf.Service.Transaction { public class Result : IResult { public System.Collections.Generic.List<Item> GetResult() { DBDataContext dbcx = new DBDataContext(); var result = from l in dbcx.Item orderby l.CreatedTime descending select l; return result.ToList(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Larryle.WcfWebClient { public partial class TestTransaction : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void text_Click(object sender, EventArgs e) { TransactionHelloSvc.HelloClient hell = new TransactionHelloSvc.HelloClient(); TransactionHiSvc.HiClient hi = new TransactionHiSvc.HiClient(); TransactionResultSvc.ResultClient result = new TransactionResultSvc.ResultClient(); System.Transactions.TransactionOptions tr = new System.Transactions.TransactionOptions(); tr.Timeout = new TimeSpan(0, 0, 30); tr.IsolationLevel = System.Transactions.IsolationLevel.Serializable; using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope()) { try { hell.WriteHello("larryle1"); hi.WriteHi("larryle2"); hell.Close(); hi.Close(); ts.Complete(); ClientScript.RegisterStartupScript(this.GetType(), "js", "alert('ok')", true); } catch (Exception ex) { ClientScript.RegisterStartupScript(this.GetType(), "js", "alert('失败')", true); } } this.GridView1.DataSource = result.GetResult(); this.GridView1.DataBind(); result.Close(); } } }
<?xml version="1.0"?> <configuration> <system.serviceModel> <bindings> <netTcpBinding> <binding name="StreamedBindingConfiguration" transferMode="Streamed" maxReceivedMessageSize="1073741824" receiveTimeout="00:10:00"></binding> </netTcpBinding> <netMsmqBinding> <binding name="MSMQBindingConfiguration"> <security> <transport msmqAuthenticationMode="None" msmqProtectionLevel="None"/> <message clientCredentialType="UserName"/> </security> </binding> </netMsmqBinding> <wsHttpBinding> <binding name="SecurityBindingConfiguration"> <security> <message clientCredentialType="UserName"/> </security> </binding> <binding name="TransactionConfiguration" transactionFlow="true"> </binding> </wsHttpBinding> <ws2007HttpBinding> <binding name="SessionManagementBinding" receiveTimeout="00:10:00"> <reliableSession enabled="true"/> <security> <message establishSecurityContext="true"/> </security> </binding> </ws2007HttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="BindingBehavior"> <serviceMetadata httpGetEnabled="true"/> </behavior> <behavior name="MessageBehavior"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> </behavior> <behavior name="InstanceModeBehavior"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> </behavior> <behavior name="ExceptionBehavior"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> </behavior> <behavior name="SecurityBehavior"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> <serviceCredentials> <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Larryle.Wcf.Service.Security.CustomNamePasswordValidator,Larryle.Wcf.Service"/> <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/> <clientCertificate> <authentication certificateValidationMode="None"/> </clientCertificate> </serviceCredentials> </behavior> </serviceBehaviors> </behaviors> <services> <service name="Larryle.Wcf.Service.Binding.Hello" behaviorConfiguration="BindingBehavior"> <endpoint address="net.tcp://localhost:54321/Binding/Hello" binding="netTcpBinding" contract="Larryle.Wcf.ServiceContract.Binding.IHello"></endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint> <host> <baseAddresses> <add baseAddress="http://localhost:12345/Binding/"/> </baseAddresses> </host> </service> <service name="Larryle.Wcf.Service.ConcurrencyLock.Hello" behaviorConfiguration="MessageBehavior"> <endpoint address="Hello" binding="wsHttpBinding" contract="Larryle.Wcf.ServiceContract.ConcurrencyLock.IHello"></endpoint> <host> <baseAddresses> <add baseAddress="http://localhost:12345/ConcurrencyLock/"/> </baseAddresses> </host> </service> <service name="Larryle.Wcf.Service.Contract.PersonManager" behaviorConfiguration="MessageBehavior"> <endpoint address="PersonManager" binding="mexHttpBinding" contract="ConfigurationNameTest"> </endpoint> <host> <baseAddresses> <add baseAddress="http://localhost:12345/Contract/"/> </baseAddresses> </host> </service> <service name="Larryle.Wcf.Service.Exception.Hello" behaviorConfiguration="ExceptionBehavior"> <endpoint address="Hello" binding="wsHttpBinding" contract="Larryle.Wcf.ServiceContract.Exception.IHello"> </endpoint> <host> <baseAddresses> <add baseAddress="http://localhost:12345/Exception/"/> </baseAddresses> </host> </service> <service name="Larryle.Wcf.Service.Security.Hello" behaviorConfiguration="SecurityBehavior"> <endpoint address="Hello" binding="wsHttpBinding" contract="Larryle.Wcf.ServiceContract.Security.IHello" bindingConfiguration="SecurityBindingConfiguration"> </endpoint> <host> <baseAddresses> <add baseAddress="http://localhost:12345/Security/"/> </baseAddresses> </host> </service> <service name="Larryle.Wcf.Service.SessionManagement.Hello" behaviorConfiguration="MessageBehavior"> <endpoint address="Hello" binding="ws2007HttpBinding" bindingConfiguration="SessionManagementBinding" contract="Larryle.Wcf.ServiceContract.SessionManagement.IHello"> </endpoint> <host> <baseAddresses> <add baseAddress="http://localhost:12345/SessionManagement/" /> </baseAddresses> </host> </service> <service name="Larryle.Wcf.Service.Transaction.Hello" behaviorConfiguration="MessageBehavior"> <endpoint address="Hello" binding="wsHttpBinding" contract="Larryle.Wcf.ServiceContract.Transaction.IHello" bindingConfiguration="TransactionConfiguration"> </endpoint> <host> <baseAddresses> <add baseAddress="http://localhost:12345/Transaction/Hello"/> </baseAddresses> </host> </service> <service name="Larryle.Wcf.Service.Transaction.Hi" behaviorConfiguration="MessageBehavior"> <endpoint address="Hi" binding="wsHttpBinding" contract="Larryle.Wcf.ServiceContract.Transaction.IHi" bindingConfiguration="TransactionConfiguration"> </endpoint> <host> <baseAddresses> <add baseAddress="http://localhost:12345/Transaction/Hi"/> </baseAddresses> </host> </service> <service name="Larryle.Wcf.Service.Transaction.Result" behaviorConfiguration="MessageBehavior"> <endpoint address="Result" binding="wsHttpBinding" contract="Larryle.Wcf.ServiceContract.Transaction.IResult" bindingConfiguration="TransactionConfiguration"> </endpoint> <host> <baseAddresses> <add baseAddress="http://localhost:12345/Transaction/Result"/> </baseAddresses> </host> </service> </services> </system.serviceModel> <startup> <supportedRuntime version="v2.0.50727"/> </startup> </configuration>