接口继承WCF服务中的其他接口

时间:2010-06-01 11:09:26

标签: c# wcf inheritance interface callback

在我的解决方案中,有一些WCF服务,每个服务都实现了自己的回调接口。假设它们被称为:Subscribe1ISubscribe1ICallback1等。

在ICallbacks之间共享了一些方法,所以我创建了一个以下接口:

interface ICallback
{
    [OperationContract]
    void CommonlyUsedMethod();
}

并且我在所有内容中继承了它:ICallback1 : ICallbackICallback2 : ICallback等。并从所有回调接口中删除了CommonlyUsedMethod()

现在,在服务端代码上,一切都编译得很好,服务可以像往常一样开始工作。但是,当我更新客户端的服务引用时,CommonlyUsedMethod()从reference.cs文件(ISubscribeCallback部分)中消失,并且不能再用于将数据发送回客户端。

4 个答案:

答案 0 :(得分:4)

尝试在基接口上设置ServiceContract属性。

答案 1 :(得分:1)

好的,这是确切的代码,我尽可能地压缩它。只需启动一个新的控制台应用程序并复制/粘贴它。启动它并为其添加服务引用。 CommonlyUsedMethod()不存在于引用中,而其他方法则是。它可能是框架4吗?

using System;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace TestService
{
    class Program
    {
        static void Main()
        {
            var serviceHost=new ServiceHost(typeof(Subscribe1), new Uri("net.tcp://localhost:8888"));
            serviceHost.Description.Behaviors.Add(new ServiceMetadataBehavior());
            serviceHost.AddServiceEndpoint(typeof(ISubscribe1), new NetTcpBinding(SecurityMode.None), string.Empty);
            serviceHost.AddServiceEndpoint("IMetadataExchange", MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
            serviceHost.Open();

            Console.WriteLine("Working!");
            while(Console.ReadKey(true).Key!=ConsoleKey.Escape) { }
        }
    }

    [ServiceContract]
    interface ICallbackBase
    {
        [OperationContract]
        void CommonlyUsedMethod();
    }

    [ServiceContract]
    interface ICallback1 : ICallbackBase
    {
        [OperationContract]
        void SpecificMethod();
    }

    [ServiceContract(CallbackContract=typeof(ICallback1))]
    interface ISubscribe1
    {
        [OperationContract]
        void TestMethod();
    }

    [ServiceBehavior]
    class Subscribe1 : ISubscribe1
    {
        [OperationBehavior]
        public void TestMethod()
        {
        }
    }
}

答案 2 :(得分:0)

这是否反映了代码中的内容?

[ServiceContract]
public interface ICallbackBase
{
    [OperationContract]
    void CommonlyUsedMethod();
}

[ServiceContract]
public interface ICallback1 : ICallbackBase
{
    [OperationContract]
    void SpecificMethod();
}

这实质上是我在生产解决方案中的结构,然后我使用添加服务引用时生成的代理来从客户端访问我的方法。

作为参考,生成的界面如下所示:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(ConfigurationName="MyNamespace.ICallback1")]
public interface ICallback1 {

    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ICallbackBase/CommonlyUsedMethod", ReplyAction="http://tempuri.org/ICallbackBase/CommonlyUsedMethodResponse")]
    void CommonlyUsedMethod();

}

注意OperationContractAttribute中的“ICallbackBase” - 它确实知道方法的来源。

答案 3 :(得分:0)

我不确定您尝试使用WCF做什么是可能的。在WCF中使用继承时,需要将KnownType属性应用于DataContract,以便DataContractSerializer知道序列化它并使其在另一端可用。由于您无法在接口上放置KnownType属性,因此无法告诉序列化程序在另一端需要这样做。因此,当您在客户端上实现它时,它不会显示出来。