.net WCF合同名称';IMyService';找不到?

.net WCF合同名称';IMyService';找不到?,.net,wcf,exception-handling,.net,Wcf,Exception Handling,在服务“MyService”实现的合同列表中找不到合同名称“IMyService”…-->System.InvalidOperationException:在服务“MyService”实现的合约列表中找不到合约名称“IMyService” 这让我快发疯了。我有一个WCF web服务可以在我的开发人员机器上运行,但是当我将它复制到我用于测试的虚拟机上时,我会得到一个错误,它似乎表明我没有实现该接口,但它没有意义,因为该服务可以在我的windows xp IIS上运行。虚拟机使用Windows Se

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

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

这里需要注意的一件事是,我在虚拟机上遇到这个错误,即使我只是试图以客户端的身份访问web浏览器中的服务

注意:我正在使用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>

好的,这并不能真正满足我的问题,但我找到了一种解决方法,那就是安装.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配置