WCF中的同时呼叫处理

时间:2012-01-30 15:25:04

标签: wcf concurrency simultaneous

我是.net的新手并且对WCF知之甚少,所以如果有任何愚蠢的问题,请耐心等待。我想知道如果我的代码没有显式生成任何线程,WCF如何处理SELF-HOST场景中的同时调用。因此,在stackoverflow上阅读了很多内容后,我创建了一个测试应用程序,但它似乎无法正常工作。请指教。非常感谢。

请注意......

  1. 我的问题只是关于WCF 自我托管,所以请不要参考任何与IIS相关的内容。
  2. 我正在使用 webHttpBinding
  3. 我知道有maxConnection和服务限制设置,但我只对我的研究设置中的 2个同时通话感兴趣。所以不应该有最大连词或线程池问题。
  4. 我的测试服务使用会话。
  5. 代码如下......

    namespace myApp
    {
      [ServiceContract(SessionMode = SessionMode.NotAllowed)]
      public interface ITestService
      {
        [OperationContract]
        [WebGet(UriTemplate="test?id={id}")]
        string Test(int id);
      }
    
      [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, 
                       ConcurrencyMode = ConcurrencyMode.Multiple)]
      public class TestService : ITestService
      {
        private static ManualResetEvent done = new ManualResetEvent(false);
    
        public string Test(int id)
        {
          if (id == 1)
          {
            done.Reset();
            done.WaitOne();
          }
          else
          {
            done.Set();
          }
        }
      } 
    }
    

    app.config ...

      <system.serviceModel>
        <behaviors>
          <endpointBehaviors>
            <behavior name = "TestEndpointBehavior">
              <webHttp/>
            </behavior>
          </endpointBehaviors>
        </behaviors>
        <services>
          <service name = "myApp.TestService">
            <endpoint address = "" behaviorConfiguration="TestEndpointBehavior"
                      binding = "webHttpBinding"
                      contract = "myApp.ITestService">
            </endpoint>
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8080/test/"/>
              </baseAddresses>
            </host>
          </service>
        </services>
      </system.serviceModel>
      <system.web>
        <sessionState mode = "Off" />
      </system.web>
    

    我是如何测试的......

    一旦应用程序运行,我打开我的浏览器,以防万一,打电话给 http:// localhost:8080 / test / test?id = 1 。此请求使应用程序暂停等待信号,即WaitOne。然后在另一个浏览器选项卡中再次调用 http:// localhost:8080 / test / test?id = 2 。期望的是该请求将设置信号,因此服务器将返回两个请求。

    但我看到应用程序挂起并且第二个请求的测试功能从未输入。显然我的代码不支持同时/并发调用。哪里不对了?

1 个答案:

答案 0 :(得分:0)

您可以使用单个类来设置wcf服务并丢弃接口。您还需要添加global.asax文件。进行第二次通话后,所有人都将返回“已完成”。

此配置可以满足您的需求。 使用以下命令创建TestService.cs:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,
             ConcurrencyMode = ConcurrencyMode.Multiple)]
[ServiceContract(SessionMode = SessionMode.NotAllowed)]
public class TestService
{
    private static ManualResetEvent done = new ManualResetEvent(false);

    [OperationContract]
    [WebGet(UriTemplate = "test?id={id}")]
    public string Test(int id)
    {
        if (id == 1)
        {
            done.Reset();
            done.WaitOne();
        }
        else
        {
            done.Set();
        }
        return "finished";
    }


}

的web.config:

<configuration>
<system.web>
  <compilation debug="true" targetFramework="4.0" />
</system.web>
<system.webServer>
 <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
<system.serviceModel>
<standardEndpoints>
<webHttpEndpoint>
    <!-- 
        Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
        via the attributes on the <standardEndpoint> element below
    -->
<standardEndpoint name="" helpEnabled="false"  >    </standardEndpoint>


  </webHttpEndpoint>
</standardEndpoints>
<behaviors>
  <serviceBehaviors>
    <behavior>

      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpGetEnabled="true" />
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
</configuration>

Global.asax文件:

public class Global : System.Web.HttpApplication
{

    protected void Application_Start(object sender, EventArgs e)
    {
        RouteTable.Routes.Add(new ServiceRoute("testservice", new WebServiceHostFactory(), typeof(TestService)));
    }
}