C# WCF - 调用服务失败

3

当我尝试使用WCF测试客户端访问我的新Web服务时,出现了以下错误。奇怪的是,有时它会执行一次,然后开始弹出此错误。

无法调用服务。可能的原因:服务离线或无法访问;客户端配置与代理不匹配;现有代理无效。更多详细信息,请参见堆栈跟踪。您可以尝试通过启动新代理、恢复默认配置或刷新服务来恢复。

我的代码(接口):

[ServiceContract(Namespace = "http://rivworks.com/Services/2010/04/19")]
public interface ISync
{
    [OperationContract]
    bool Execute(long ClientID);
}

我的代码(类):

public class Sync : ISync
{
    #region ISync Members
    bool ISync.Execute(long ClientID)
    {
        return model.Product(ClientID);
    }
    #endregion
}

我的配置(编辑-发布了整个serviceModel部分):

<system.serviceModel>
  <diagnostics performanceCounters="Default">
    <messageLogging logMalformedMessages="true" logMessagesAtServiceLevel="true"
      logMessagesAtTransportLevel="true" />
  </diagnostics>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="false" />
  <behaviors>
    <endpointBehaviors>
      <behavior name="JsonpServiceBehavior">
        <webHttp />
      </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
      <behavior name="SimpleServiceBehavior">
        <serviceMetadata httpGetEnabled="True" policyVersion="Policy15"/>
      </behavior>
      <behavior name="RivWorks.Web.Service.ServiceBehavior">
        <!-- 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="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>

  <services>
    <service name="RivWorks.Web.Service.NegotiateService" behaviorConfiguration="SimpleServiceBehavior">
      <endpoint address=""
                binding="customBinding"
                bindingConfiguration="jsonpBinding"
                behaviorConfiguration="JsonpServiceBehavior"
                contract="RivWorks.Web.Service.NegotiateService" />
      <!--<host>
        <baseAddresses>
          <add baseAddress="http://kab.rivworks.com/services"/>
        </baseAddresses>
      </host>
      <endpoint address=""
                binding="wsHttpBinding"
                contract="RivWorks.Web.Service.NegotiateService" />-->
      <endpoint address="mex"
                binding="mexHttpBinding"
                contract="RivWorks.Web.Service.NegotiateService" />
    </service>
    <service name="RivWorks.Web.Service.Sync" behaviorConfiguration="RivWorks.Web.Service.ServiceBehavior">
      <endpoint address="" binding="wsHttpBinding" contract="RivWorks.Web.Service.ISync" />
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    </service>
  </services>

  <extensions>
    <bindingElementExtensions>
      <add name="jsonpMessageEncoding" type="RivWorks.Web.Service.JSONPBindingExtension, RivWorks.Web.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    </bindingElementExtensions>
  </extensions>

  <bindings>
    <customBinding>
      <binding name="jsonpBinding" >
        <jsonpMessageEncoding />
        <httpTransport manualAddressing="true"/>
      </binding>
    </customBinding>
  </bindings>    
</system.serviceModel>

有两个问题:

  1. 我错过了什么导致出现这个错误?
  2. 我如何增加服务的超时时间?

TIA!


@Petoj:它的意思是“提前致谢”。 - Jason Punyon
1
你能重新发布你的配置文件吗?在<services>下有两个闭合</service>标签,但只有一个开放的<service>标签。我无法确定你是否只是修剪了相关服务,还是它真的出了问题。 - Ben Hoffstein
另外,你在哪里定义了RivWorks.Web.Service.ServiceBehavior? - Ben Hoffstein
本地网站服务器,还是Web Farm或者Web Garden?另外,看起来你正在使用LINQ to SQL,这是真的吗?如果不是,你在使用哪个ORM? - code4life
我正在使用LINQ to SQL。找到了问题所在。(1)测试应用程序如果抛出错误而不中止通道,则会锁定通道。(2)同步例程深处存在一个由数据库驱动的问题。在整个同步过程周围添加try/catch,并继续钻取InnerException以找到它。一旦我放置了try/catch(优雅的失败),通道就不再锁定。 - Keith Barrows
单一的Web服务器,目前托管在服务器上。我还添加了整个serviceModel部分,因为我有一个基于JSONP的Web服务也在运行 - 而且它仍然可以工作。(请参见我上面的评论) - Keith Barrows
1个回答

5

发现问题如下:

  1. Web服务内部出现了未处理的错误。
  2. 测试应用程序在遇到错误时没有执行ABORT操作。相反,它被留在未处理(且未报告)状态并且由于错误导致通道被锁定。

在内部方法周围加上try/catch语句,这样我就可以记录错误并且测试应用程序不会被锁定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接