.net WCF合同名称';IMyService';找不到?
在服务“MyService”实现的合同列表中找不到合同名称“IMyService”…-->System.InvalidOperationException:在服务“MyService”实现的合约列表中找不到合约名称“IMyService” 这让我快发疯了。我有一个WCF web服务可以在我的开发人员机器上运行,但是当我将它复制到我用于测试的虚拟机上时,我会得到一个错误,它似乎表明我没有实现该接口,但它没有意义,因为该服务可以在我的windows xp IIS上运行。虚拟机使用Windows Server 2003 IIS。有什么想法吗 这里需要注意的一件事是,我在虚拟机上遇到这个错误,即使我只是试图以客户端的身份访问web浏览器中的服务 注意:我正在使用principalPermissionMode=“UseWindowsGroups”,但这在我的本地计算机上不是问题。我只是将自己添加到相应的windows组中。但是我的虚拟机没有运气 配置:.net WCF合同名称';IMyService';找不到?,.net,wcf,exception-handling,.net,Wcf,Exception Handling,在服务“MyService”实现的合同列表中找不到合同名称“IMyService”…-->System.InvalidOperationException:在服务“MyService”实现的合约列表中找不到合约名称“IMyService” 这让我快发疯了。我有一个WCF web服务可以在我的开发人员机器上运行,但是当我将它复制到我用于测试的虚拟机上时,我会得到一个错误,它似乎表明我没有实现该接口,但它没有意义,因为该服务可以在我的windows xp IIS上运行。虚拟机使用Windows Se
<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>
好的,这并不能真正满足我的问题,但我找到了一种解决方法,那就是安装.NET 3.5。因为我的其他两个环境都有3.0 所以我真的还没有确定为什么它会在一个环境中工作,而不是在另一个环境中,特别是在接口错误的情况下
如图所示?您能发布界面的代码吗。。。?
通常情况下,如果您没有在接口中指定ServiceContract属性,就会发生这种情况…端点上的contract属性不需要是完全限定的命名空间吗?是@Garry您是对的。 终结点中的协定应为完全限定名
<endpoint binding="basicHttpBinding" bindingConfiguration="basicHttpBinding" name="MyService" bindingName="basicHttpBinding" bindingNamespace="http://my.test.com" contract="Namespace.IMyService">
@Garry(我知道有点晚了)
如果ServiceContract属性定义了ConfigurationName,则该值应为端点中的值,而不是完全限定的名称。正如OP所描述的,我现在遇到了这个问题,这就是我的解决方案。希望这有助于其他偶然发现此问题的人。[ServiceContract]
在我的案例中缺失。这是一个稍微不常见的解决方案,适用于我的情况,但有相同的错误:
可以使用以下属性覆盖协定命名空间:
[System.ServiceModel.ServiceContractAttribute([...], ConfigurationName = "IServiceSoap")]
public interface ISomeOtherServiceName
这将需要:
<endpoint address="" binding="basicHttpBinding" contract="IServiceSoap" />
而不是通常的(名称空间)。ISomeOtherServiceName
这可能是代码生成的结果,在我的例子中,我有相同的错误,但问题的来源不同。我一边学习,一边使用VisualStudio中的Silverlight模板中启用Silverlight的WCF服务创建了一个服务。我称之为TerritoryService。以这种方式创建服务时,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>
然而,我正在研究的示例使用域服务。使用这些时,您将从DomainService继承。因此,我删除了我创建的TerritoryService,然后从VisualStudio中Web模板菜单的模板中创建了DomainService类。我继续工作,一切都很好。但是当我运行它时,根据这个问题的标题,我得到了一个错误
问题是,当您从域服务继承时,web.config文件中不会创建这样的条目。它不需要它。但是,当您删除通过启用Silverlight的web服务创建的服务时,它不会删除web.config文件中的条目
因此,由于我在调用服务时将这两个服务命名为TerritoryService,因此web.config中的条目被拉入运行状态,服务器开始查找以这种方式定义的服务,但由于我删除了该服务,服务器找不到该服务
因此,解决方案是简单地删除上面由Visual Studio在配置文件中自动创建的条目存根,而不是在我删除服务时由Visual Studio自动删除的条目存根。一旦我这样做了,问题就解决了。
由于命名上的“冲突”,我花了半个小时来解决这个问题。它“看起来”非常正确,并且与许多示例一致。因此,如果您是从域服务类继承的,您不需要/不应该像创建wcf服务时那样在配置文件中有条目。在我的例子中有两个错误:
配置部分是从另一个代理项目复制的,我忘了将名称空间更改为完整路径
作为一个客户机,我将端点部分复制到服务节点中——该客户机也是一个wcf服务
我有这样做的习惯
<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个项目时),但“完全限定”的类名似乎起到了至关重要的作用。服务元素中的“名称”属性和端点元素中的“合同”属性不正确。它们必须是完全限定的名称:
<service name="namespace.MyService">
<endpoint contract="namespace.IMyService" >
一旦您将值更改为完全限定名,应该可以解决您的错误。在我的例子中,问题是名称空间命名错误。HTH使用visual studio 2013“添加”->“服务”菜单选项创建web配置