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

C# WCF中的两个接口和一个具体类,c#,.net,wcf,known-types,C#,.net,Wcf,Known Types,请检查下面的示例 namespace GServices { [ServiceKnownType(typeof(SearchType))] [ServiceContract(SessionMode = SessionMode.Allowed)] public interface ITest { [OperationContract] int subtract(int x, int y); } [ServiceKno

请检查下面的示例

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有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>

当我运行此服务并检查wsdl时,我可以看到itest2中的方法也出现在wsdl中。在本例中,只应公开subtract()方法。但是add()方法也是公开的

我的要求是ITest接口中的方法只能公开。在本例中,我只想公开ITest中声明的subtract()方法。但它们的两个实现都只驻留在一个具体类“G”中。我错过了什么

编辑:我已给出我的Service.svc文件内容:

<%@ ServiceHost Language="C#" Debug="true" Service="GServices.G"  %>


如果不需要将
ITest2
接口作为服务公开,只需从中删除
ServiceContract
属性即可

如果您需要在不同的服务中使用
ITest2
,可以使用接口继承来解决此问题:

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

[ServiceContract]
interface ITest2Service : ITest2 { }

在第一个服务(也实现了
ITest
)中使用
ITest2
,在第二个服务中使用
ITest2Service

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

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

你公开的方法的返回类型是什么?是
G
还是
ITest
@abatishchev:好的,对不起,我从开发代码中复制并更改了名称。对你来说,拥有真实的名称不是更方便吗?只是想知道:)@abatishchev:我也这么做了。我已经给出了“contract=”GServices.itest“在端点配置中,绑定中的契约不应该是
GServices.ITest
而不是
GServices.ITest
?我想OP应该公开每个端点的服务契约。并通过单个类实现所有契约。听起来很合理,但他明确表示:我只是想通过WCF@abatishchev:我只需要通过WCF对ITest和ITest2进行爆炸。但是它的不同服务。这就是为什么我提出[服务合同]there@thya:所以service1/endpoint1公开interface1,service2/endpoint2公开interface2,对吗?虽然这可以解决您的问题,但我不确定此设置的值是多少。在第一次服务中,您将如何调用
ITest2
?每次客户端创建会话并在会话结束时销毁时,它都会由WCF实例化。非常感谢@carlosfigueira,你救了我的命!!!再次感谢你。实际的问题是,我只有一个实现这两个接口的具体类。如果我们在服务标签中指定完全合格的类名,我会得到这个错误“一个名为'service'的子元素在相同的配置范围内已经存在”。我所做的是,我从实际的实现类“G”创建了一个名为“G1”的新派生类,我在服务名中引用了这个名称,现在可以了!!!!谢谢你,伙计!