未能调用服务.可能的原因:调用时服务脱机或不可访问
本文关键字:服务 调用 脱机 访问 | 更新日期: 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的端口地址相同。让我详细描述一下这个对我有效的解决方案。
检查端口地址有两个步骤。
-
在WCF项目中,右键单击您的服务文件(例如Service1.svc)->,然后选择在浏览器中查看现在在浏览器中您有类似的urlhttp://localhost:61122/Service1.svc所以现在记下您的端口地址为61122
-
右键单击您的wcf项目->,然后选择属性->转到Web选项卡->Now在服务器部分-->选择Use Visual Studio Development Server>>选择1特定端口并提供我们之前从Service1.svc服务中找到的端口地址。这就是(61122)。
早些时候,我有一个不同的端口地址。在正确地指定了端口地址(这是我从第一步EndpointAddress 61122中得到的)之后,我的问题就解决了。
我希望这能解决你的问题。
NetTcp绑定在默认情况下是安全的。在客户端和服务之间的安全身份验证过程中,WCF确保服务的标识与此元素的值匹配。因此,服务需要配置:
<identity>
<dns value ="localhost"/>
</identity>