c # – Dos interfaces y una clase concreta en WCF

por favor revise el siguiente ejemplo

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 tiene el método de resta () e Itest2 tiene el método add ().

Ambos son implementados por una clase concreta llamada G.

Si solo quiero exponer el ITest a través de WCF, tengo la siguiente configuración de punto final

  <service name="GQS1" behaviorConfiguration="GQwcfBehaviour">
    <endpoint address="DP2Svcs" binding="wsHttpContextBinding" bindingConfiguration="wsHttpEndpointBindingConfig" contract="GServices.itest">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
  </service>

Cuando ejecuto este servicio y compruebo el wsdl, puedo ver que los métodos que se encuentran en itest2 también aparecían en wsdl. en este caso de ejemplo, el método restar () solo debe estar expuesto. Pero el método add () también está expuesto.

Mi requerimiento es tener métodos en la interfaz de ITest que solo estén expuestos. en este caso, quiero exponer solo el método de resta () que se declara en ITest. Pero su implementación reside en una sola clase concreta “G”. ¿Que me estoy perdiendo aqui?

Edición: he dado el contenido de mi archivo Service.svc:

<%@ ServiceHost Language="C#" Debug="true" Service="GServices.G"  %>
Mejor respuesta
Asegúrese de que el valor del atributo de nombre en la etiqueta < service > El elemento en la configuración es el nombre completo de la clase de servicio. En su configuración, tiene el nombre del contrato de punto final calificado por un espacio de nombres (GServices.itest), pero el servicio no es (GQS1). Si no tiene ninguna configuración de servicio para un servicio específico, WCF agregará un punto final predeterminado que expondrá el problema que tiene. Por ejemplo, en el código a continuación, donde se comenta la línea que agrega un punto final, el WSDL en el servicio muestra ambas operaciones. Pero si elimina el comentario de la línea (lo que hará que el servicio tenga solo un punto final del tipo ITest), solo se mostrará la operación “restar”.

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();
    }
}

Por favor indique la dirección original:c # – Dos interfaces y una clase concreta en WCF - Código de registro