我有一个托管在服务中的 Wcf 服务,然后是一个与 tcp 连接的 mvc 客户端。在我更新服务之前一切正常,现在我无法更新客户端的引用。
这是一份服务合同
[ServiceContract(Name = "Rules", Namespace = "http://api.xxx.com/2013/10/Rules")]
public interface IRuleContractV1
{
[OperationContract(Name="GetRules")]
PagedData<RuleDTO> GetRules();
[OperationContract(Name="GetRulePaths")]
PagedData<Rule_PathDTO> GetRulePaths(int ruleId);
}
现在第二个操作合同 GetRulePaths 是我在更新参考停止工作时添加的合同。如果我删除 PagedData 并只返回一个列表,那么它就可以工作。如果我复制 PagedData 类并更改它的名称,那么 GetRules 返回 PagedData<> 和 GetRulePaths PagingData<>。(PagedData 是一个简单的类,它以可枚举的形式保存项目和数据的总数)。
尝试更新服务引用时出现的错误是: 无法识别 URI 前缀。元数据包含无法解析的引用:“net.tcp://localhost:8002/SSAPI/mex”。元数据包含无法解析的引用:“net.tcp://localhost:8002/SSAPI/mex”。
这是 AppConfig wcf 配置
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
...
<services>
<service name="SSService.Wcf.AdminService">
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="tcpMexBinding"
name="mexAdminApi" contract="IMetadataExchange" />
<endpoint address="Rules" binding="netTcpBinding" bindingConfiguration="tcpSecureBinding"
contract="SS.Wcf.Admin.Contracts.IRuleContractV1" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8002/SSAPI" />
<add baseAddress="http://localhost:8003/SSAPI" />
</baseAddresses>
</host>
</service>
</services>
...
<bindings>
<netTcpBinding>
<binding name="tcpSecureBinding">
<security mode="Transport">
<message algorithmSuite="Basic256Sha256Rsa15" />
</security>
</binding>
</netTcpBinding>
<mexTcpBinding>
<binding name="tcpMexBinding" />
</mexTcpBinding>
</bindings>
找到了原因,但不确定为什么会发生这种情况。这是我的 PagedData 类,如下所示:
[System.Runtime.Serialization.DataContract(Name = "PagedData", Namespace = "http://api.xxx.com/2013/10/types")]
public class PagedData<T> where T : class
{
/// <summary>
/// Container with the actual data that is paged.
/// </summary>
[System.Runtime.Serialization.DataMember(Name = "Data")]
public List<T> Data { get; set; }
/// <summary>
/// Total number of items.
/// </summary>
[System.Runtime.Serialization.DataMember(Name = "TotalItems")]
public long TotalItems { get; set; }
}
如果我删除数据成员 Data 的注释,那么它可以更新引用。