未能调用服务.可能的原因:调用时服务脱机或不可访问

本文关键字:服务 调用 脱机 访问 | 更新日期: 2023-09-27 18:30:11

我的服务配置如下:

<system.serviceModel>
    <services>
      <service name="WcfService1.Service1" behaviorConfiguration="MyServiceTypeBehaviors">
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://127.0.0.1:808/service" />
          </baseAddresses>
        </host>
        <endpoint address="net.tcp://127.0.0.1:808/service/"
                  binding="netTcpBinding"
                  contract="WcfService1.IService1"/>
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"   />
      </service>
    </services>
    <protocolMapping>
      <add scheme="net.tcp" binding="netTcpBinding"/>
    </protocolMapping>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceTypeBehaviors">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    <endpointBehaviors>
      <behavior name="MyEndpointBehaviour">
        <webHttp/>
      </behavior>
    </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

客户端为:

 <system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="NetTcpBinding_IService1" sendTimeout="00:05:00" />
            </netTcpBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://127.0.0.1/service/" binding="netTcpBinding"
                bindingConfiguration="NetTcpBinding_IService1" contract="IService1"
                name="NetTcpBinding_IService1">
                <identity>
                    <servicePrincipalName value="host/MachineName" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>

当使用WCFTestClient或SVCutil时,我能够发现和访问服务并生成代理或存根。

但当我想调用任何一个方法时,都会出现以下错误:

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

套接字连接已中止这可能是由于处理消息时出错、远程主机超过接收超时或潜在的网络资源问题造成的。本地套接字超时为"00:04:59.9980468"。

未能调用服务.可能的原因:调用时服务脱机或不可访问

在端点块内设置以下值

<identity>
   <dns value ="localhost"/>
</identity>

也许不是你想要的答案,但为了在本地机器上进行开发,我总是使用HTTP端点。我发现Net.TCP只有在IIS中的服务器上托管时才会表现得很好。

一旦部署到IIS服务器,添加NET.TCP端点就足够容易了。注意:基址不再有任何影响,因为它是在IIS中设置的。要测试新的端点,最好在远程访问服务器时在浏览器中打开服务,这样可以获得最佳的错误消息。

如果我理解正确的话,您在创建服务引用时试图选择端点?现在就是这样。如果您使用127.0.0.1/service/Service1.svc 创建服务参考

您应该在配置文件中看到如下内容。(当我创建服务端点时,我总是用协议作为后缀来命名它们。

        <endpoint address="http://servername:8090/servername/servername.svc/Business"
              binding="basicHttpBinding" bindingConfiguration="BusinessHTTP"
              contract="servername.IService" name="BusinessHTTP" />
       <endpoint address="net.tcp://servername:8030/Service/Service.svc/Business"
              binding="netTcpBinding" bindingConfiguration="BusinessTCP"
              contract="servername.IService" name="BusinessTCP" />

然后在代码中,您可以选择使用哪个端点。

Dim svc as New SeviceReferenceName.BusinessClient("BusinessTCP")"

我也遇到过同样的问题。这是EndpointAddress的端口地址问题。在Visual studio中,文件的端口地址(例如Service1.svc)和wcf项目的端口地址必须与您提供给EndpointAddress的端口地址相同。让我详细描述一下这个对我有效的解决方案。

检查端口地址有两个步骤。

  1. 在WCF项目中,右键单击您的服务文件(例如Service1.svc)->,然后选择在浏览器中查看现在在浏览器中您有类似的urlhttp://localhost:61122/Service1.svc所以现在记下您的端口地址为61122

  2. 右键单击您的wcf项目->,然后选择属性->转到Web选项卡->Now在服务器部分-->选择Use Visual Studio Development Server>>选择1特定端口并提供我们之前从Service1.svc服务中找到的端口地址。这就是(61122)

早些时候,我有一个不同的端口地址。在正确地指定了端口地址(这是我从第一步EndpointAddress 61122中得到的)之后,我的问题就解决了。

我希望这能解决你的问题。

NetTcp绑定在默认情况下是安全的。在客户端和服务之间的安全身份验证过程中,WCF确保服务的标识与此元素的值匹配。因此,服务需要配置:

<identity>
   <dns value ="localhost"/>
</identity>