wcf 不会rollback,请大家帮忙看看。

在学习wcf,最近学到wcf事务。自己写了一个示例,就是不会rollback,请大家帮忙看看。
服务器端代码:
namespace Host
{
class Program
{
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(Calc));

WSHttpBinding wsbinding = new WSHttpBinding();

wsbinding.TransactionFlow = true;
host.AddServiceEndpoint(typeof(ICalc), wsbinding, "http://localhost:8003");

host.Opened += delegate
{
Console.WriteLine("services is open!");
};

host.Open();
Console.ReadKey();
}
}

[ServiceContract]
public interface ICalc
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Mandatory)]
double Add(double x);
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class Calc : ICalc
{
[OperationBehavior(TransactionScopeRequired = true)]
public double Add(double x)
{
Console.WriteLine(Transaction.Current.TransactionInformation.CreationTime);
Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);
return x + 1;
}
}
}

然后客户端代码:
class Program
{
static void Main(string[] args)
{
WSHttpBinding ws = new WSHttpBinding();
ws.TransactionFlow=true;

ChannelFactory<ICalc> mychannel = new ChannelFactory<ICalc>(ws, "http://localhost:8003");
mychannel.Open();

ICalc myclient = mychannel.CreateChannel();

double x = 3.5;
double y = 0;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
try
{
Console.WriteLine(Transaction.Current.TransactionInformation.CreationTime);
Console.WriteLine(Transaction.Current.TransactionInformation.LocalIdentifier);
y = myclient.Add(x);
throw new Exception("throw new exception");
scope.Complete();
mychannel.Close();
}
catch (Exception ex)
{
Transaction.Current.Rollback();
mychannel.Abort();
Console.WriteLine(ex.Message);
}
}
Console.WriteLine(x);
Console.WriteLine(y);

Console.ReadKey();
}
}

然后每次都是打印
x=3.5
y=4.5

好郁闷啊,我不是有抛出异常了吗?为什么不会Rollback呢。
...全文
303 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
易寒 2013-10-18
  • 打赏
  • 举报
回复
将服务端的Distributed Transcation Coordinator服务启用
feiyun0112 2013-10-17
  • 打赏
  • 举报
回复
你这不是数据库操作,没用到事务呀

*****************************************************************************
签名档: http://feiyun0112.cnblogs.com/
风之影子 2013-10-17
  • 打赏
  • 举报
回复
另外有时间去看一下.net平台下错误处理机制。

特别是错误的传递过程。
风之影子 2013-10-17
  • 打赏
  • 举报
回复
把上面的代码 throw new Exception("throw new exception");


改为:int x=int.Parse("abc");

再试一下。
钝忆思梦 2013-10-17
  • 打赏
  • 举报
回复
印象中TransactionScope这个要配置机器的,以前在弄sql事务时遇过,不过很遗憾,我也没配成功过,具体方法可搜索“TransactionScope配置”,不知是不是这个原因。

12,162

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧