WCF合同名称'IMyService'找不到?

无法在服务“MyService”实现的合同列表中find合同名称“IMyService”。—> System.InvalidOperationException:无法在实施的合同列表中find合同名称“IMyService”服务“我的服务”。

这真让我抓狂。 我有一个在我的开发机器上工作的WCF Web服务,但是当我将它复制到我用于testing的虚拟机时,出现错误,似乎表明我没有实现该接口,但它不能使感觉,因为该服务在我的Windows XP的IIS上工作。 虚拟机使用Windows Server 2003 IIS。 有任何想法吗?

有一点需要注意的是,即使只是试图在Web浏览器中作为客户端访问服务,我也会在虚拟机上发生这个错误。

注意:我正在使用principalPermissionMode =“UseWindowsGroups”,但是这不是我的本地机器上的问题。 我只是把自己添加到适当的Windows组。 但是我的虚拟机没有运气。

configuration:

<configuration> <system.serviceModel> <diagnostics> <messageLogging logEntireMessage="false" maxSizeOfMessageToLog="2147483647" /> </diagnostics> <services> <service behaviorConfiguration="MyServiceBehaviors" name="MyService"> <endpoint binding="basicHttpBinding" bindingConfiguration="basicHttpBinding" name="MyService" bindingName="basicHttpBinding" bindingNamespace="http://my.test.com" contract="IMyService"> </endpoint> </service> </services> <bindings> <basicHttpBinding> <binding name="basicHttpBinding" maxReceivedMessageSize="2147483647"> <readerQuotas maxStringContentLength="2147483647" /> <security mode="TransportCredentialOnly"> <transport clientCredentialType="Windows" proxyCredentialType="None" /> </security> </binding> </basicHttpBinding> <netTcpBinding> <binding name="WindowsClientOverTcp" maxReceivedMessageSize="2147483647"> <readerQuotas maxStringContentLength="2147483647" /> </binding> </netTcpBinding> <wsHttpBinding> <binding name="wsHttpBinding" maxReceivedMessageSize="2147483647"> <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> </binding> </wsHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="MyServiceBehaviors"> <serviceMetadata httpGetEnabled="true" /> <serviceAuthorization principalPermissionMode="UseWindowsGroups" impersonateCallerForAllOperations="false" /> <serviceCredentials /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration> 

[ServiceContract]在我的情况下是失踪。

@加里(有点晚了,我知道)

如果您的ServiceContract属性定义了一个ConfigurationName,则这应该是端点中的值,而不是完全限定的名称。 我现在刚刚遇到了OP所描述的这个问题,这对我来说是个解决scheme。 希望这可以帮助别人绊倒这一点。

这是一个稍微不寻常的解决scheme,适用于我的情况,同样的错误:

合约名称空间可能会被覆盖,具有以下属性:

 [System.ServiceModel.ServiceContractAttribute([...], ConfigurationName = "IServiceSoap")] public interface ISomeOtherServiceName 

这将需要:

 <endpoint address="" binding="basicHttpBinding" contract="IServiceSoap" /> 

而不是通常的(命名空间).ISomeOtherServiceName

这可能是代码生成的结果,在我的情况下是WSCFBlue

端点上的协定属性不需要是完全限定的名称空间吗?

您的service元素中的name属性和endpoint元素中的contract属性不正确。 他们需要是完全合格的名字:

 <service name="namespace.MyService"> <endpoint contract="namespace.IMyService" > 

一旦您将值更改为应解决错误的完全限定名称。

是的@你说得对。 端点合同应该是完全合格的名称

 <endpoint binding="basicHttpBinding" bindingConfiguration="basicHttpBinding" name="MyService" bindingName="basicHttpBinding" bindingNamespace="http://my.test.com" contract="Namespace.IMyService"> 

我有这样做的习惯…

 <system.serviceModel> <services> <service name="Service" behaviorConfiguration="wsHttpBehaviour"> <endpoint binding="wsHttpBinding" contract="IService" bindingConfiguration="wsHttpBinding" /> <endpoint contract="IService" binding="mexHttpBinding" address="mex" /> </service> 

当我应该这样做…

 <system.serviceModel> <services> <service name="namespace.Service" behaviorConfiguration="wsHttpBehaviour"> <endpoint binding="wsHttpBinding" contract="namespace.IService" bindingConfiguration="wsHttpBinding" /> <endpoint contract="namespace.IService" binding="mexHttpBinding" address="mex" /> </service> 

看看我的意思…这是有史以来最愚蠢的事情(特别是当应用程序只有1或2项),但“完全合格”的类名似乎使所有的差异。

你可以发布你的界面的代码…? 通常情况下,如果您尚未在Interface中指定ServiceContract属性,则会发生这种情况。

我有同样的错误,但问题的根源是不同的。 我正在学习,并且首先使用Visual Studio中的Silverlight模板创build了一个使用Silverlight的WCF服务。 我称之为TerritoryService。 当你以这种方式创build一个服务时,web.config被改变如下:

  <services> <service name="Services.TerritoryService"> <endpoint address="" binding="customBinding" bindingConfiguration="Services.TerritoryService.customBinding0" contract="Services.TerritoryService" /> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> 

但是,使用这些从DomainServiceinheritance的这些Im工作的例子使用DomainServices.ie。 所以我删除了我创build的TerritoryService,然后从Visual Studio中的Web模板菜单中的模板创build一个DomainService类。 我继续工作,一切正常。 但是当我跑了它,我得到了一个错误,根据这个问题的标题。

原来的问题是,当你从域名服务inheritance,web.config文件中不会创build这样的条目。 它不需要它。 但是,当您删除通过启用Silverlight的Web服务创build的服务时,它不会删除web.config文件中的条目。

所以,因为我在服务被调用的时候把两个服务都命名为TerritoryService,所以web.config中的条目被启用了,服务器去寻找一个以它找不到的服务,因为我删除了它。

所以解决方法是简单地删除上面的条目存根,这是由Visual Studio在configuration文件中自动创build的,但是在删除服务时不会被Visual Studio自动删除。 一旦我这样做,问题就解决了。

我花了一个半小时才解决这个问题,因为命名为“冲突”。 它“看上去”非常正确,符合许多例子。 因此,如果您从域服务类inheritance,则不需要/不应该在configuration文件中包含条目,就像创buildwcf服务时一样。

在我的情况下,这个问题是一个错误的命名空间。 HTH

使用Visual Studio 2013的“添加” – >“服务”菜单选项为我创build了Webconfiguration部分,但是将“端点”“合同”设置为具体类的名称而不是界面。

一旦我纠正所有开始工作。

你有在IIS的虚拟机上设置任何身份validation? 尝试将其设置为匿名,看看它是否运行。

好的,这并不能真正满足我的问题,但是我发现解决这个问题的方法之一就是安装.NET 3.5。 因为我的其他环境都有3.0。

所以我真的没有确定为什么它会在一个环境中,而不是在另一个环境中,尤其是那个接口错误。

去搞清楚?

我的情况有两个错误:

  1. configuration部分是从另一个代理项目复制的,我忘了将命名空间更改为完整path。

  2. 作为客户端,我将端点部分复制到服务节点 – 客户端也是一个wcf服务。