我创建了WCF Rest服务。当我连续从客户端(即从Android手机)发出同样的请求时,它正在使用不同的线程,而thread.sleep也无法正常工作。
我的代码就像这样......
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Single)]
public class Service1 : IService1
{
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "VerifyLogin")]
public bool VerifyLogin(Login loginCred)
{
bool res = false;
string strThreadPrint= "";
try
{
strThreadPrint= Thread.CurrentThread.ManagedThreadId.ToString() + " time at : "+DateTime.Now;
Thread.Sleep(5000);
dbcon = new DBConnection();
//for testing here i am throwing an exception so that its going to catch block and responce sent back to client with exception details as shown in catch block.
dbcon.VerifyLogin(loginCred.Username.Trim(), loginCred.Password.Trim());
}
catch (Exception sqlex)
{
objErrorClass = new ErrorClass("Login class", sqlex.Message + " --- " + strThreadPrint, "CNMK");
throw new WebFaultException<ErrorClass>(objErrorClass, System.Net.HttpStatusCode.BadRequest);
}
}
}
当我使用fiddler发送请求时跟随
Requestbody
{"Username":"13","Password":"dgdf"}
那时我正在以Json格式获得响应
Response from service:
{"ErrorDesc":"login failed --- 33 time at :09/04/2013 12:31:30"}
{"ErrorDesc":"login failed --- 35 time at :09/04/2013 12:31:30"}
{"ErrorDesc":"login failed --- 41 time at :09/04/2013 12:31:30"}
{"ErrorDesc":"login failed --- 45 time at :09/04/2013 12:31:30"}
因此实例模式和并发模式不适用于wcf restful services ???? 或者我在我的代码中做错了什么?请帮帮我
答案 0 :(得分:1)
如果我理解正确,你想让WCF主持一个服务操作的实例,然后让服务在响应前等待5秒?
如果是这样,那么您应该使用InstanceContextMode.Single,这意味着所有服务请求都将路由到服务的同一个实例进行处理。
修改强>
我不明白你想看到什么行为。你有4个并发请求,你有一个每个呼叫服务实例,你将有4个不同的服务实例同时处理所有4个请求。我看不出你输出的问题是什么。
<强> EDIT2 强>
ConcurrencyMode将确定服务的EACH INSTANCE如何处理分派给THAT INSTANCE的并发请求。
但是,您正在指定实例PER CALL。您有4个呼叫,因此您将拥有该服务的四个实例,最终结果是每个呼叫将同时处理。
因此,您观察到的行为对于您配置服务的方式完全正确。
如果您希望单个服务实例处理所有调用,则需要指定InstanceContextMode.Single。