元数据包含在指定名称空间时无法解析的引用
问题描述:
我在服务和客户端之间共享的项目中有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,但这对我来说不是一个好的解决方案,因为我不想重建现有客户端。
答
配置中缺少一些细节。
NetTcpBinding的可是没有任何地址端点
的baseaddress可是没有规定的任何港口。 如果你不使用任何端口80默认情况下只会用于http.Its总是会更好地克服这个默认值http.net对于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添加服务引用://本地主机:8080 /服务/
谢谢,但指定端口不会对错误有什么区别。此外,这个应用程序多年来一直在net tcp上运行,并且添加了服务引用,但没有命名空间。 – Sarah