我有一个必须维护的旧 System.Web.Services.WebService(不是 WCF)。
偶尔我会遇到一些我将其描述为竞争条件的有线行为。
服务挂起并且必须重新启动。
有时我会得到这个例外:
System.NotSupportedException: Multiple simultaneous connections or connections with different connection strings inside the same transaction are not currently supported. at MySql.Data.MySqlClient.MySqlConnection.Open() ...
我知道根本原因是什么。该服务使用与 mysql 对话的库,并且在设计时并未考虑到 web 服务。不幸的是我不能改变这个库。
一个示例 webmethod 如下所示:
[WebMethod(EnableSession = true)]
public void DoSomething()
{
var login = this.Session["login"] as LoginDetails;
ExternalLib.SetLoginData(login.Schema, login.User, login.Pass);
ExternalLib.PerformTask();
}
所以这里的问题是:
ExternalLib.SetLoginData
只是设置一些全局变量ExternalLib.PerformTask
执行数据库调用,一些在事务中。- 过程就像
1. Create MySqlConnection or take it from cache 2. Create MySqlCommand 3. Execute Command 4. Dispose command
客户 a) 打电话DoSomething()
,我初始化他的连接。他的工作客户端 b) 调用完成了一半,DoSomething()
这显然更改了客户端 a 的登录数据,并且事务中的下一个调用将使用来自客户端 b) 的登录,这会导致事务。
无论如何,我知道这是一个糟糕的设计,但我的问题是如何解决这个问题。目前(因为我只有 10 个客户端)我在一个不同的端口上创建了一个专用网站,所有这些都指向同一个根目录,但这是一个错误的解决方案。
也许有可能在其 on 领域内运行每个会话。有什么建议么。如果我对 WCF 正确理解此页面是默认行为:http: //msdn.microsoft.com/en-us/magazine/cc163590.aspx
Per-Call 服务
Per-call 服务是 Windows Communication Foundation 的默认实例化模式。当服务类型配置为每次调用激活时,服务实例即公共语言运行时 (CLR) 对象仅在客户端调用正在进行时存在。每个客户端请求都会获得一个新的专用服务实例。