未调用WCF方法

时间:2010-10-28 09:46:52

标签: c# .net wcf wcf-client

我有一个非常奇怪的问题。我有一个WCF服务和一个调用它的一些方法的控制台应用程序。在某些时候,它不能再调用它们中的一个。它只是调用方法,但它从不输入它。它只是等待和等待......什么都没发生。

我是否应该以某种方式刷新服务客户端?我尝试创建一个新的服务客户端对象

QueryingServiceClient queryingClient = new QueryingServiceClient();

然后再次调用该方法,但它不起作用。只是补充说我在停止工作之前几次调用该方法和其他几种方法。

有什么想法吗?

感谢。

4 个答案:

答案 0 :(得分:1)

假设:

  • 您的服务使用会话实例模式(默认模式)
  • 您的客户端会为其对服务的每次调用创建一个新的代理实例。
  • 您的客户在通话后不会处置代理。

问题可能是您正在耗尽服务器上的可用插槽数(在这种情况下为会话数),以达到最大并发会话数。然后,您的客户端将等待在服务端关闭会话的定义超时(在这种情况下显然永远不会发生)。

建议修复:

  • 将InstanceContextMode设置为PerCall,除非您确实需要WCF会话。
  • 使用后请务必关闭代理。

编辑:

using (var proxy = new Proxy())
{
    // Use the proxy as much as needed
    proxy.Method();
}

答案 1 :(得分:0)

它停止前的次数是否相同?您是否达到连接限制?

您的WCF服务如何实例化?

Singleton,Session,PerCall?

您可以发布客户端和服务器端点的配置部分吗?

如果使用WcfClient工具,它是否能够始终如一地工作?

答案 2 :(得分:0)

这很奇怪,它不会等待并永远等待。您应该获得WCF超时异常。 app.config中的超时值是多少?

如果您没有收到任何超时异常,那么可能就是您没有调用那个服务方法。我知道这很明显,但有时长名字的方法可能会互相混淆。如果你正在调试客户端,你必须已经排除了这一点。

答案 3 :(得分:0)

感谢您的回复。

这不是永远的,我没有正确表达自己。一段时间后,我得到以下异常:

  

超出了最大重试次数,远程端点没有响应。可靠的会议出了问题。这通常表明远程端点不再可用。

这是一个单身人士。这是app.config的一部分:

<system.serviceModel>
    <bindings>
          <wsHttpBinding>
                <binding name="WSHttpBinding_QueryingService" closeTimeout="00:25:00"
                      openTimeout="00:25:00" receiveTimeout="00:25:00" sendTimeout="00:25:00"
                      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                      maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"
                      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                      allowCookies="false">
                      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                            maxArrayLength="2147483647" maxBytesPerRead="2147483647"
                            maxNameTableCharCount="2147483647" />
                      <reliableSession ordered="true" inactivityTimeout="00:25:00"
                            enabled="true" />
                      <security>
                            <transport>
                                  <extendedProtectionPolicy policyEnforcement="Never" />
                            </transport>
                      </security>
                </binding>
...

在提供者方面:

<wsHttpBinding>
    <binding name="wsHttpConfig" maxReceivedMessageSize="2147483647" receiveTimeout="00:25:00">
      <readerQuotas maxDepth="2147483647"
                    maxStringContentLength="2147483647"
                    maxArrayLength="2147483647"
                    maxBytesPerRead="2147483647"
                    maxNameTableCharCount="2147483647" />
      <reliableSession enabled="true" ordered="true" />
    </binding>
  </wsHttpBinding>

...

<service name="Platform.WSLA.Impl.Services.Querying.QueryingService"
           behaviorConfiguration="Default.Behavior">

    <endpoint address="http://localhost:8004/Platform/wsla/querying/QueryingService"
              binding="wsHttpBinding"
              bindingConfiguration="wsHttpConfig"
              contract="Platform.WSLA.Contracts.Services.Querying.IQueryingService" />
    <endpoint address="mex"
              binding="mexHttpBinding"
              name="MetadataExchange"
              contract="IMetadataExchange" />

    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8004/Platform/wsla/querying" />
      </baseAddresses>
    </host>

  </service>