WCF中的两个接口和一个具体类

ama*_*maz 6 .net c# wcf known-types

请查看以下示例

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ITest有subtract()方法,Itest2有add()方法.

两者都由一个名为G的具体类实现.

如果我只想通过WCF公开ITest,我有以下端点配置

  <service name="GQS1" behaviorConfiguration="GQwcfBehaviour">
    <endpoint address="DP2Svcs" binding="wsHttpContextBinding" bindingConfiguration="wsHttpEndpointBindingConfig" contract="GServices.itest">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
  </service>
Run Code Online (Sandbox Code Playgroud)

当我运行这个服务并检查wsdl时,我可以看到itest2中的方法也出现在wsdl中.在此示例中,应仅公开subtract()方法.但是add()方法也暴露了.

我的要求是只暴露ITest接口中的方法.在这种情况下,我想只公开在ITest中声明的subtract()方法.但它们的实现都只存在于一个具体的类"G"中.我在这里错过了什么?

编辑:我已经提供了Service.svc文件内容:

<%@ ServiceHost Language="C#" Debug="true" Service="GServices.G"  %>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

car*_*ira 4

确保配置中元素name中的属性值是服务类的完全限定名称。在您的配置中,您具有由命名空间 (GServices.itest) 限定的端点合约名称,但服务不是 (GQS1)。如果您没有针对特定服务的任何服务配置,WCF 将添加一个默认端点,这将暴露您遇到的问题。例如,在下面的代码中,添加一个端点的行被注释掉,服务上的 WSDL 显示这两项操作。但是,如果您取消注释该行(这将使服务只有一个 ITest 类型的端点),则只会显示“减去”操作。<service>

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();
    }
}
Run Code Online (Sandbox Code Playgroud)