需要澄清REST服务中的WCF并发性

时间:2013-09-04 07:42:45

标签: wcf

我创建了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 ???? 或者我在我的代码中做错了什么?请帮帮我

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你想让WCF主持一个服务操作的实例,然后让服务在响应前等待5秒?

如果是这样,那么您应该使用InstanceContextMode.Single,这意味着所有服务请求都将路由到服务的同一个实例进行处理。

修改

我不明白你想看到什么行为。你有4个并发请求,你有一个每个呼叫服务实例,你将有4个不同的服务实例同时处理所有4个请求。我看不出你输出的问题是什么。

<强> EDIT2

ConcurrencyMode将确定服务的EACH INSTANCE如何处理分派给THAT INSTANCE的并发请求。

但是,您正在指定实例PER CALL。您有4个呼叫,因此您将拥有该服务的四个实例,最终结果是每个呼叫将同时处理。

因此,您观察到的行为对于您配置服务的方式完全正确。

如果您希望单个服务实例处理所有调用,则需要指定InstanceContextMode.Single。