两个接口和WCF一个具体的类(Two Interface and one concrete clas

2019-09-19 02:42发布

请检查下面的例子

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具有减法()方法和Itest2具有添加()方法。

两者都是由一个叫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。 在该示例情况下,减法()方法应当仅被暴露。 但是add()方法也被暴露出来。

我的要求是已在ITest接口方法应该只暴露。 在这种情况下,我要揭露其在ITEST声明仅减法()方法。 但无论其执行驻留在只有一个具体的类“G”。 我缺少的是在这里吗?

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

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

Answer 1:

确保的值name在属性<service>在配置元件是服务类的全限定名 。 在你的配置你有一个命名空间(GServices.itest)合格端点合同名称,但服务不是(GQS1)。 如果你没有特定服务的任何服务confugration,WCF会添加一个默认端点其中西港岛线暴露你有问题。 例如,在下面的代码,其中,这增加了一个端点的线被注释掉,对服务的WSDL同时显示操作。 但是,如果你取消对该行(这将使得服务有型ITEST只有一个端点),只有“减”操作将被显示。

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


Answer 2:

如果您不需要ITest2暴露为服务接口,只需取下ServiceContract从它的属性。

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

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

[ServiceContract]
interface ITest2Service : ITest2 { }

使用ITest2第一服务(也实现ITest )和ITest2Service第二服务。



文章来源: Two Interface and one concrete class in WCF