找不到 WCF 合同名称“IMyService”?

Posted

技术标签:

【中文标题】找不到 WCF 合同名称“IMyService”?【英文标题】:WCF Contract Name 'IMyService' could not be found? 【发布时间】:2010-10-16 01:25:12 【问题描述】:

在服务“MyService”实施的合同列表中找不到合同名称“IMyService”.. ---> System.InvalidOperationException:在合同列表中找不到合同名称“IMyService”由服务“MyService”实现。

这快把我逼疯了。我有一个可以在我的开发机器上运行的 WCF Web 服务,但是当我将它复制到我用于测试的虚拟机时,我收到似乎表明我没有实现接口的错误,但它没有感觉,因为该服务确实可以在我的 windows xp IIS 上运行。虚拟机使用 Windows Server 2003 IIS。有什么想法吗?

这里需要注意的一点是,即使只是尝试在 Web 浏览器中作为客户端访问该服务,我也会在我的 VM 上收到此错误。

注意:我使用的是 principalPermissionMode="UseWindowsGroups",但这在我的本地计算机上不是问题。我只是将自己添加到适当的 Windows 组中。但是我的虚拟机没有运气。

配置:

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

【问题讨论】:

带有接口的程序集是否对应用程序可见?另外,您是否在配置文件中将命名空间指定为接口名称的一部分? 【参考方案1】:

[ServiceContract] 在我的情况下丢失了。

【讨论】:

这也发生在我身上。我花了几分钟查看 app.config,因为错误不是很清楚:\. 啊!!!!他妈的这一切都见鬼去吧……我每次都被这个抓到!谢谢:-) 在我的例子中,我更改了接口的名称,忘记更新 ServiceContractAttribute 上的 ConfigurationName。 我已经搜索了将近一个小时,然后我阅读了那个答案,然后 facepalm 哦,这里也一样 :) 只是浪费了 1 多小时,谢谢兄弟 :)【参考方案2】:

@Garry(我知道有点晚了)

如果您的 ServiceContract 属性定义了 ConfigurationName,则这应该是端点中的值,而不是完全限定名称。正如OP所描述的那样,我现在遇到了这个问题,这就是我的解决方案。希望这可以帮助其他偶然发现此问题的人。

【讨论】:

这个答案帮助我解决了我的问题。合约接口上的ServiceContractAttribute 定义了NameNamespaceConfigurationName 的值。我在实现服务的 web.config 中的 endpoint 元素上更改了 namebindingNamespacecontract 以匹配并解决了问题。 谢谢你,我把头从砖墙上敲了半个小时才找到这个。 重命名了配置绑定,但 ServiceContract 属性中的 ConfigurationName 出现了这个问题。修复名称冲突是解决方案,万岁!【参考方案3】:

这是一个稍微不常见的解决方案,适用于我的情况并出现相同的错误:

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

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

这需要:

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

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

这可能是代码生成的结果,在我的例子中是 WSCFBlue

【讨论】:

这是我的情况,配置造成了 2 小时后解决的混乱【参考方案4】:

您的 service 元素中的 name 属性和 endpoint 元素中的 contract 属性不正确。它们需要是完全限定的名称:

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

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

【讨论】:

哇,我以某种方式删除了 [ServiceContract] 的一部分,在更正它之后,IIS 错误消息仍然显示端点不应该是命名空间限定的,并且服务应该。嘎嘎。两个合格的人终于成功了。【参考方案5】:

endpoint 上的 contract 属性不需要是完全限定的命名空间吗?

【讨论】:

这也是我的问题的解决方案。令人困惑的是,网上很多例子都没有包含命名空间。 这也是我的问题的解决方案。【参考方案6】:

是的@Garry,你是对的。 端点中的合同应该是完全限定名称

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

【讨论】:

【参考方案7】:

我有这样做的习惯......

<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 个项目时),但“完全合格”的类名似乎使一切变得不同。

【讨论】:

【参考方案8】:

你能发布你的界面代码吗...? 通常,如果您没有在界面中指定 ServiceContract 属性,则会发生这种情况...

【讨论】:

【参考方案9】:

我有同样的错误,但问题的根源不同。我边做边学,我首先使用 Visual Studio 中 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>

我正在处理的示例使用 DomainServices.i.e。使用这些时,您从 DomainService 继承。所以我删除了我创建的 TerritoryService,然后从 Visual Studio 的 Web 模板菜单中的模板创建了一个 DomainService 类。我继续工作,一切都编译得很好。但是当我运行它时,根据这个问题的标题,我得到了一个错误。

事实证明,当您从域服务继承时,web.config 文件中不会创建此类条目。它不需要它。但是,当您删除通过启用 Silverlight 的 Web 服务创建的服务时,它不会删除 web.config 文件中的条目。

因此,因为我在调用服务时将这两个服务都命名为 TerritoryService,所以 web.config 中的条目被拉动,服务器开始寻找以这种方式定义的服务,但由于我已删除而无法找到它。

所以解决方案是简单地删除上面由 Visual Studio 在配置文件中自动创建的条目存根,但在我删除服务时 Visual Studio 没有自动删除。一旦我这样做了,问题就解决了。

由于命名“冲突”,我花了半个小时才解决这个问题。它“看起来”非常正确,并且与许多示例一致。因此,如果您从域服务类继承,则不需要/不应该像创建 wcf 服务时那样在配置文件中有条目。

【讨论】:

这个引导我走上了正确的道路。在以下情况后出现此错误:1)我创建了一个普通的 WCF 服务(它更新了我的 web.config)。 2)然后我删除了该服务。 3) 然后我创建了一个同名的 WCF 数据服务。删除 web.config 更改修复了我。【参考方案10】:

在我的例子中,问题是命名空间错误。高温

【讨论】:

【参考方案11】:

使用 Visual Studio 2013 的“添加”->“服务”菜单选项为我创建了 Web 配置部分,但“端点”“合同”设置为具体类的名称而不是接口。

我一更正一切就开始工作了。

【讨论】:

【参考方案12】:

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

所以我真的没有确定为什么它会在一种环境中工作而不是在另一种环境中工作,尤其是在那个界面错误的情况下。

去看看?

【讨论】:

【参考方案13】:

我的情况有两个错误:

    配置部分是从另一个代理项目复制的,我忘记将命名空间更改为完整路径。

    作为客户端,我将端点部分复制到服务节点中 - 客户端也是 wcf 服务。

【讨论】:

以上是关于找不到 WCF 合同名称“IMyService”?的主要内容,如果未能解决你的问题,请参考以下文章

找不到引用合同的默认端点元素 - 托管 wcf

WCF 错误 - 找不到引用合同“UserService.UserService”的默认端点元素

找不到引用合同的默认端点元素:通过 Powershell cmdlet 连接到 WCF 端点

找不到端点异常 - WCF Web 服务

找不到端点异常 - WCF Web 服务

如何对我的 WCF 客户端类进行单元测试?