【发布时间】:2013-06-11 12:50:18
【问题描述】:
我有一个必须维护的旧 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(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
按通话服务
每次调用服务是 Windows 通信 Foundation 默认实例化模式。当服务类型为 配置为每次调用激活、服务实例、公共 语言运行时 (CLR) 对象,仅在客户端调用时存在 进步。每个客户端请求都会获得一个新的专用服务实例。
【问题讨论】:
-
如果您必须保留代码,那么包装它可能不是一个坏计划。它不可扩展,但对于 10 个客户端,如果每次查询不需要 10 分钟,我看不出问题。
标签: c# web-services iis asmx