Due interfacce e una class concreta in WCF

si prega di controllare l’esempio di seguito

namespace GServices { [ServiceKnownType(typeof(SearchType))] [ServiceContract(SessionMode = SessionMode.Allowed)] public interface ITest { [OperationContract] int subtract(int x, int y); } [ServiceKnownType(typeof(SearchType))] [ServiceContract(SessionMode = SessionMode.Allowed)] public interface ITest2 { [OperationContract] int add(int x, int y); } public class G : ITest2, ITest { public int add(int x, int y) { return x + y; } public int subtract(int x, int y) { return x + y; } } } 

ITest ha il metodo sottrazione () e Itest2 ha il metodo add ().

Entrambi sono implementati da una class concreta chiamata G.

Se voglio solo esporre l’ITest attraverso WCF, ho la seguente configurazione di endpoint

         

quando eseguo questo servizio e controllo il wsdl, posso vedere che i metodi che sono in itest2 sono comparsi anche in wsdl. in questo esempio, il metodo sottrazione () deve essere esposto. Ma anche il metodo add () è esposto.

Il mio requisito è che i metodi in ITest Interface vengano esposti solo. in questo caso, voglio esporre solo il metodo sottrarre () che è dichiarato in ITest. Ma entrambi della loro implementazione risiedono in una sola class concreta “G”. Cosa mi manca qui?

Modifica: ho dato il mio contenuto del file Service.svc:

  

inserisci la descrizione dell'immagine qui

Assicurarsi che il valore dell’attributo name nell’elemento nella configurazione sia il nome completo della class di servizio. Nella tua configurazione hai il nome del contratto endpoint qualificato da uno spazio dei nomi (GServices.itest), ma il servizio non lo è (GQS1). Se non si dispone di alcuna configurazione del servizio per un servizio specifico, WCF aggiungerà un endpoint predefinito che esporrà il problema riscontrato. Ad esempio, nel codice seguente, dove la riga che aggiunge un endpoint è commentata, il WSDL sul servizio mostra entrambe le operazioni. Ma se disattivi la linea (che renderà il servizio con un solo endpoint di tipo ITest), verrà mostrata solo l’operazione “sottrazione”.

 public class StackOverflow_11339853 { [ServiceContract(SessionMode = SessionMode.Allowed)] public interface ITest { [OperationContract] int subtract(int x, int y); } [ServiceContract(SessionMode = SessionMode.Allowed)] public interface ITest2 { [OperationContract] int add(int x, int y); } public class G : ITest2, ITest { public int add(int x, int y) { return x + y; } public int subtract(int x, int y) { return x + y; } } public static void Test() { string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; ServiceHost host = new ServiceHost(typeof(G), new Uri(baseAddress)); // host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), ""); host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true }); host.Open(); Console.WriteLine("Host opened"); Console.Write("Press ENTER to close the host"); Console.ReadLine(); host.Close(); } } 

Se non è necessario che l’interfaccia ITest2 esposta come servizio, rimuovere semplicemente l’attributo ServiceContract da esso.

Se hai bisogno di ITest2 in un servizio diverso, puoi utilizzare l’ereditarietà dell’interfaccia per risolvere questo problema:

 interface ITest2 { [OperationContract] int Add(int x, int y); } [ServiceContract] interface ITest2Service : ITest2 { } 

Utilizzare ITest2 nel primo servizio (che implementa anche ITest ) e ITest2Service nel secondo servizio.