我构建了一个WCF服务,它在IE地址中运行良好,但是一旦我将它添加到wcftestclient并调用一个方法,就会出现错误并显示为:
无法调用该服务。可能的原因:服务离线或无法访问;客户端配置与代理不匹配;现有代理无效。有关更多详细信息,请参阅堆栈跟踪。您可以尝试通过启动新代理,还原到默认配置或刷新服务来恢复。
错误详情:
The Address property on ChannelFactory.Endpoint was null. The ChannelFactory's Endpoint must have a valid Address specified.
at System.ServiceModel.ChannelFactory.CreateEndpointAddress(ServiceEndpoint endpoint)
at System.ServiceModel.ChannelFactory`1.CreateChannel()
at System.ServiceModel.ClientBase`1.CreateChannel()
at System.ServiceModel.ClientBase`1.CreateChannelInternal()
at System.ServiceModel.ClientBase`1.get_Channel()
at MyDownloadSvcClient.DeleteMyFolder(Int32 UserId, Int32 FolderId)
配置文件是:(在10/9更新)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<services>
<service name="MyDownloadSvcClient">
<endpoint binding="basicHttpBinding" />
</service>
</services>
<bindings />
<client>
<endpoint address="http://localhost/MyDownloadSvc.svc"
binding="basicHttpBinding" bindingConfiguration="" contract="IMyDownloadSvc"
name="Test" />
</client>
</system.serviceModel>
</configuration>
有什么不对吗?
提前致谢, 伊莱恩
答案 0 :(得分:7)
是的,肯定有问题。服务端点WCF必须始终提供ABC - 地址,绑定,合同。您只在配置中定义绑定 - 这正是错误消息所说的 - 您的地址为空。
所以你的配置片段应该类似于:
<system.serviceModel>
<services>
<service name="MyDownloadSvcClient">
<endpoint
address="http://localhost:8888/YourService"
binding="basicHttpBinding"
contract="IYourServiceContract" />
</service>
</services>
地址定义服务端点所在的位置,以及外部世界可用的地址。如果你没有地址,那么服务就无法与外界交谈。它是您的服务的 WHERE 。如果您使用* .svc文件在IIS中托管服务,则可能会将此地址留空,因为服务地址由* .svc文件所在的服务器和虚拟目录确定 - 但您仍需要提供address=""
您的服务<service>/<endpoint>
代码的输入!
绑定定义服务如何互动 - 协议,安全设置等等 - 您的服务的 HOW 。
最后合同定义(通过服务合同,通常是服务定义中的接口)调用者可以使用哪些服务方法(函数)。您必须提供合同,否则调用者无法知道他可以为您的服务调用哪些方法。这是该服务的 WHAT 。
答案 1 :(得分:2)
在使用WebHttpBinding_创建服务引用后,您的服务可以从IE和客户端上的绑定名称开始工作。所以你使用的是REST服务,不是吗?此类服务无法添加为服务引用,WcfTestClient不支持此类服务。
答案 2 :(得分:2)
我有这个错误,我能够创建一个.svclog文件并查看实际错误(它来自我的IOC容器......编码错误我没有在我的IOC注册课程)
有关如何创建.svclog文件并查看它的信息,请参阅有关MDSN的文章: https://msdn.microsoft.com/en-us/library/ms732023.aspx
答案 3 :(得分:1)
为什么使用自定义绑定?您尚未定义协议或基于现有绑定的绑定。只需使用普通basicHttpBinding
。
<client>
<endpoint binding="basicHttpBinding" contract="IMyDownloadSvc" name="WebHttpBinding_IMyDownloadSvc" address="http://....." />
</client>
您还需要输入地址。
答案 4 :(得分:0)
您还可以尝试向端点添加标识:
<endpoint address ="A" binding="B" contract="C">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>