【问题标题】:metadata contains a reference that cannot be resolved when namespace specified元数据包含指定命名空间时无法解析的引用
【发布时间】:2017-10-06 02:24:41
【问题描述】:

我在服务和客户端之间共享的项目中有一个 Class2 和一个 Class1。

<DataContract(Name:="Class1", Namespace:="http://www.example.com/my/app")> _
Public Class Class1
    <DataMember> _
    Public Property Test
End Class

<DataContract(Name:="Class2{0}", Namespace:="http://www.example.com/my/app")>    
Public Class Class2(Of ReturnType)
    <DataMember> _
    Public Property Test As String
    <DataMember()> _
    Public Property Items() As ReturnType()
End Class

这是我的服务接口:

<ServiceContract(Name:="Service")> _
Public Interface IService

    <OperationContract()> _
    Function GetStuff() As Class2(Of Class1)

End Interface

在我的服务项目中,我还有一个继承自共享类的 Class1:

<DataContract(Namespace:="http://www.example.com/my/app")>
Public Class Class1
    Inherits [Shared].Entities.Class1

End Class

我的服务配置:

  <?xml version="1.0"?>
     <configuration>

        <system.serviceModel>
<diagnostics>
  <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtTransportLevel="true"/>
  <endToEndTracing propagateActivity="true" activityTracing="true" messageFlowTracing="true"/>
</diagnostics>
<serviceHostingEnvironment aspNetCompatibilityEnabled="false"/>
<bindings/>
<services>
  <service behaviorConfiguration="MyServ" name="WcfService1.Service">
    <endpoint binding="netTcpBinding" bindingConfiguration="" contract="WcfService1.IService" />
    <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
      contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost/service/" />
      </baseAddresses>
    </host>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="MyServ">
      <serviceMetadata httpGetEnabled="false" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
    </behavior>
  </serviceBehaviors>
</behaviors>

当我尝试在我的客户端项目中添加服务引用时,我收到错误:

URI 前缀无法识别。 元数据包含无法解析的引用:“net.tcp://localhost/service/mex”。 元数据包含无法解析的引用:“net.tcp://localhost/service/mex”。 如果在当前解决方案中定义了服务,请尝试构建解决方案并再次添加服务引用。

如果我从服务项目中 Class1 的 DataContract 属性中删除命名空间,我就能够生成服务引用。但是我不得不添加这个命名空间,删除它会破坏其他东西。如何在保持命名空间不变的情况下生成我的服务引用?

如果我在共享项目和服务项目中将命名空间更改为 net.tcp 而不是 http,这也有效,但这对我来说不是一个好的解决方案,因为我不想重建现有客户端。

【问题讨论】:

    标签: .net vb.net wcf


    【解决方案1】:

    您的配置中缺少一些细节。

    netTcpBinding 没有任何地址端点

    基地址没有指定任何端口。 如果您不使用任何端口,则默认情况下将仅将 80 用于 http。克服 http 的默认设置总是更好。对于 nettcp 架构,您必须明确定义端口。

     <service behaviorConfiguration="MyServ" name="WcfService1.Service">
        <endpoint address=""  binding="netTcpBinding" bindingConfiguration="" contract="WcfService1.IService" />
        <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
          contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:8080/service/" />
          </baseAddresses>
        </host>
      </service>
    

    现在可以通过这个地址net.tcp://localhost:8080/service/添加服务引用

    【讨论】:

    • 谢谢,但指定端口对错误没有任何影响。此外,这个应用程序多年来一直在 net tcp 上没有端口的情况下工作,并且在没有命名空间的情况下添加服务引用也能正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多