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

}

I get "InvalidDataContractException Type 'System.Collections.Generic.List`1[T1]' cannot be exported as a schema type because it is an open generic type. You can only export a generic type if all its generic parameter types are actual types." if I host this contract.

I have read that it is good to avoid generics in ServiceContract. but is it possible to use T?

Bhaskar
  • 127
  • 1
  • 18
  • Endpoint is not defined correctly. You have specified IPolicyProvider so you get only operations defined in IPolicyProvider and not operations defined in ISecurities. – Ladislav Mrnka Aug 17 '10 at 15:40
  • you are awesome! removed IPolicyProvider and it worked. But ISecurities has to implement IPolicyProvider. How do I get both the operations? – Bhaskar Aug 17 '10 at 15:50
  • You have to add endpoit which exposes ISecurities but with concrete type specified. – Ladislav Mrnka Aug 17 '10 at 15:53
  • I have another contract ICADISSecurities which implements ISecurities (edited the code). I am exposing this endpoint in the config – Bhaskar Aug 17 '10 at 16:00

3 Answers3

3

Your problem in this case is not T in ServiceContract but T1 used as DataContract. You can use T in service contract if you replace T with specific type during service contract implementation. For data contracts (operation parameters and return types) you can't use T at all. You always have to specify concrete type. Your service contract can be rewritten with usage of ServiceKnownTypeAttribute so that T1 is replaced with FI_CusipMaster and ServiceKnownType specifies all possible classes derived from FI_CusipMaster.

Edit: Another way is not to use ServiceKnownType and use KnownTypeAttribute which has to be defined on FI_CusipMaster type.

Best regards, Ladislav

Ladislav Mrnka
  • 360,892
  • 59
  • 660
  • 670
1

As the error says, no you cannot use T. Service contracts need to be able to write out serialization information that deals with definitive types. It can't handle open generics in the exported functions

JaredPar
  • 733,204
  • 149
  • 1,241
  • 1,454
1

In your example T is a generic type. You cannot use a generic type in a ServiceContract unless it is used with a defined type parameter- as in class Foo : List<int> { }.

Nathan Taylor
  • 24,423
  • 19
  • 99
  • 156