【发布时间】:2010-08-17 13:45:23
【问题描述】:
[ServiceContract]
public interface ISecurities<T> : IPolicyProvider where T: EntityObject
{
[OperationContract(Name="GetAllSecurities")]
IEnumerable<T> GetSecurities();
[OperationContract]
IEnumerable<T> GetSecurities<T1>(List<T1> lstIdentifiers) where T1 : FI_CusipMaster;
[OperationContract]
T GetSecurity<T1>(T1 lstIdentifiers) where T1 : FI_CusipMaster;
}
//Host
///CADIS Contract
ServiceHost dmHost = new System.ServiceModel.ServiceHost(typeof(GlobalInvestors.FIPA.BLL.UDI.CADISSecurities));
Uri baseAddress = dmHost.BaseAddresses[0];
Uri policyAddress = new Uri(baseAddress.AbsoluteUri.Replace(baseAddress.AbsolutePath, ""));
dmHost.AddServiceEndpoint(
typeof(GlobalInvestors.FIPA.BLL.IPolicyProvider),
new System.ServiceModel.WebHttpBinding(),
policyAddress).Behaviors.Add(new System.ServiceModel.Description.WebHttpBehavior());
dmHost.Open();
//App.Config
<service behaviorConfiguration="UDIBehaviour" name="GlobalInvestors.FIPA.BLL.UDI.CADISSecurities">
<endpoint binding="basicHttpBinding" contract="GlobalInvestors.FIPA.BLL.UDI.ICADISSecurities" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:1667/CADIS" />
</baseAddresses>
</host>
</service>
<behavior name="UDIBehaviour">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
[ServiceContract]
[ServiceKnownType(typeof(SecurityMasterAdapter))]
public interface ICADISSecurities :ISecurities<SecurityMasterAdapter>
{
}
我收到“InvalidDataContractException Type 'System.Collections.Generic.List`1[T1]' 无法导出为架构类型,因为它是开放的泛型类型。您只能导出泛型类型的所有泛型参数类型是实际的类型。”如果我主持这份合同。
我已经读到在 ServiceContract 中避免泛型是件好事。但是可以用T吗?
【问题讨论】:
-
端点定义不正确。您已指定 IPolicyProvider,因此您只能获得 IPolicyProvider 中定义的操作,而不是 ISecurities 中定义的操作。
-
你太棒了!删除了 IPolicyProvider 并且它起作用了。但是 ISecurities 必须实现 IPolicyProvider。如何获得这两项操作?
-
您必须添加暴露 ISecurities 但指定具体类型的端点。
-
我有另一个合同 ICADISSecurities 实现了 ISecurities(编辑了代码)。我在配置中公开这个端点
标签: wcf generics servicecontract