我从客户端调用了30次WebService方法(asmx):
for (var i = 0; i < 30; i++) {
WSCustom.Test(i,
function (res) {
$("#Results").append(res + "<br />");
},
function (res) {
$("#Results").append(res.get_message() + "<br />");
}
);
}
这是WebService方法:
[WebMethod(EnableSession = true)]
public string Test(int i)
{
DateTime m_oStart = DateTime.Now;
WebClient m_oClient = new WebClient();
if (i % 2 == 0)
{
byte[] res = m_oClient.DownloadData("http://www.repubblica.it/");
}
return String.Format("TotalSeconds:{0}", new string[] { DateTime.Now.Subtract(m_oStart).TotalSeconds.ToString() });
}
我的方面是asynch回复。
我的意思是,我应该立即得到15个回复(奇数i
它立即返回),并且在剩余的回复期间(需要时间下载页面服务器端)。
但事实上,outpup是不同的:它立即处理第一个电话。然后,它等待第二个完成,比我得到一些奇怪的i
回复,依此类推。
所以它根本不是异步的。
WebServices如何管理.NET中的客户端调用?我能完成整个过程吗?
结果为EnableSession = false
:
TotalSeconds:0
TotalSeconds:0
TotalSeconds:0
TotalSeconds:0
TotalSeconds:0
TotalSeconds:1,514
TotalSeconds:0
TotalSeconds:1,857
TotalSeconds:0
TotalSeconds:2,143
TotalSeconds:0
TotalSeconds:1,88
TotalSeconds:0
TotalSeconds:3,178
TotalSeconds:0
TotalSeconds:3,562
TotalSeconds:2,095
TotalSeconds:0
TotalSeconds:0
TotalSeconds:4,221
TotalSeconds:1,749
TotalSeconds:0
TotalSeconds:0
TotalSeconds:3,717
TotalSeconds:0
TotalSeconds:1,977
TotalSeconds:2,421
TotalSeconds:2,439
TotalSeconds:1,807
TotalSeconds:2,124
所以它不是会话错误。
答案 0 :(得分:5)
您的网络方法有EnableSession=true
。这实际上是队列调用,因为会话对象将为每个请求锁定。
如果您没有使用会话,则不应启用它。
来自http://msdn.microsoft.com/en-us/library/aa478952.aspx:
为了提供GetItemExclusive所需的排他性,a 会话状态提供者必须实现一种锁定机制 防止给定会话被两个或多个并发访问 请求对会话状态的读/写访问权限的请求。那个机制 通过防止并发来确保会话状态的一致性 请求覆盖彼此的更改。锁定机制 即使会话状态数据源是远程资源,也必须工作 由多个Web服务器共享。
答案 1 :(得分:2)
它是异步的,因为该方法不会在javascript中阻塞,而是在操作完成时触发回调。
它可能是并行,也不是异步。
请注意,大多数浏览器都会对发出的并发AJAX请求数量进行限制。你肯定无法一次发出30个请求。一般来说,你会看到几个,1-3左右。这就是为什么你通常会按顺序看到所有请求,而不是所有请求都在同一时间回来。
答案 2 :(得分:0)
WebService是由defualt通过线程。 如果您遇到问题,请尝试将Pool Size = 10或更多插入连接字符串, 注意如果你有一个常用的对象使用:
lock (myObjList)
{
...
}