2

我创建了 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);

            }
        }
    }

当我使用提琴手发送请求时 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 服务????还是我在我的代码中做错了什么?请帮我

4

1 回答 1

1

如果我理解正确,您希望 WCF 托管服务操作的单个实例,然后让服务在响应前等待 5 秒?

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

编辑

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

编辑2

ConcurrencyMode 将确定服务的每个实例如何处理分派到该实例的并发请求。

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

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

如果您想要一个服务实例来处理您的所有调用,那么您需要指定 InstanceContextMode.Single。

于 2013-09-04T10:32:54.533 回答