Question

[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>
{

}

je reçois « InvalidDataContractException Type « System.Collections.Generic.List`1 [T1] » ne peut pas être exporté en tant que type de schéma, car il est un type générique ouvert. Vous ne pouvez exporter un type générique si tous ses types de paramètres génériques sont les types réels « . si je serai l'hôte de ce contrat.

J'ai lu qu'il est bon d'éviter les médicaments génériques en ServiceContract. mais est-il possible d'utiliser T?

Était-ce utile?

La solution

Votre problème dans ce cas est pas T ServiceContract mais T1 utilisé comme DataContract. Vous pouvez utiliser T dans le contrat de service si vous remplacez T par type spécifique pendant l'exécution du contrat de service. vous ne pouvez pas utiliser T du tout pour les contrats de données (paramètres de fonctionnement et types de retour). Vous devez toujours spécifier le type de béton. Votre contrat de service peut être réécrite avec l'utilisation de ServiceKnownTypeAttribute de sorte que T1 est remplacé par FI_CusipMaster et ServiceKnownType spécifie toutes les classes possibles dérivées de FI_CusipMaster.

Edit:. Une autre façon est de ne pas utiliser ServiceKnownType et l'utilisation KnownTypeAttribute qui doit être défini sur le type FI_CusipMaster

Cordialement, Ladislav

Autres conseils

Comme l'erreur dit, ne vous ne pouvez pas utiliser T. Les contrats de service doivent être en mesure d'écrire des informations de sérialisation qui traite des types définitifs. Il ne peut pas gérer les génériques ouverts dans les fonctions exportées

Dans votre exemple T un type générique. Vous ne pouvez pas utiliser un type générique dans un ServiceContract à moins qu'il est utilisé avec un paramètre- de type défini comme dans class Foo : List<int> { }.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top