6

请检查以下示例

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 中声明的减法()方法。但是它们的两个实现都只存在于一个具体的类“G”中。我在这里想念什么?

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

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

在此处输入图像描述

4

2 回答 2

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();
    }
}
于 2012-07-05T14:39:39.403 回答
1

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

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

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

[ServiceContract]
interface ITest2Service : ITest2 { }

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

于 2012-07-05T07:58:59.800 回答