为什么WCF无法在wcftestclient中调用?

时间:2010-10-08 08:21:39

标签: wcf

我构建了一个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>

有什么不对吗?

提前致谢, 伊莱恩

5 个答案:

答案 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>