Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继承WCF服务中其他接口的接口_C#_Wcf_Inheritance_Interface_Callback - Fatal编程技术网

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

C# 继承WCF服务中其他接口的接口,c#,wcf,inheritance,interface,callback,C#,Wcf,Inheritance,Interface,Callback,在我的解决方案中,有几个WCF服务,每个服务都实现自己的回调接口。假设它们被称为:Subscribe1,其中issubscribe1和ICallback1等 碰巧有几个方法在ICallbacks之间共享,所以我创建了以下接口: interface ICallback { [OperationContract] void CommonlyUsedMethod(); } 我从所有回调接口中继承了它:ICallback1:ICallback,ICallback2:ICallback,

在我的解决方案中,有几个WCF服务,每个服务都实现自己的回调接口。假设它们被称为:
Subscribe1
,其中
issubscribe1
ICallback1

碰巧有几个方法在ICallbacks之间共享,所以我创建了以下接口:

interface ICallback
{
    [OperationContract]
    void CommonlyUsedMethod();
}
我从所有回调接口中继承了它:
ICallback1:ICallback
ICallback2:ICallback
,并删除了
常用方法()


现在,在服务端代码中,一切都可以正常编译,服务可以正常工作。但是,当我更新客户端的服务引用时,CommonlyUsedMethod()从reference.cs文件(IsSubscribeCallback部分)中消失,无法再用于将数据发送回客户端。

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

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

[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”-它确实知道方法的来源。

好的,这就是确切的代码,我尽可能地压缩了它。只需启动一个新的控制台应用程序并复制/粘贴它。启动它并向其添加服务引用。引用中不存在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()
        {
        }
    }
}

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

嗯。。。您是否尝试过让服务的实际实例实现这两个接口,而不是让一个接口继承另一个接口?可能值得一试。所以它更像CallbackConcreteImplementation 1:ICallback1,ICallback和CallbackConcreteImplementation 2:ICallback2,ICallback?我不知道这是否有帮助,但试一试。我无法做到这一点(或者我不知道如何做到),因为当我设置回调时,我在ISubscribe1接口之前使用它:[ServiceContract(SessionMode=SessionMode.Required,CallbackContract=typeof(ICallback1))],我几乎肯定这就是出问题的原因。我很快会再检查一遍。我在我的工作应用程序中有这个确切的场景,它在那里工作得很好;这与[ServiceContract]接口ICallback1:ICallback{[OperationContract]Method1();[OperationContract]Method2();…}的外观非常相似。。。既然你说了,我也尝试将[ServiceContract]添加到ICallback中,但没有任何帮助:(同时,尝试删除ServiceContract(和其他组合)是的,这也是我的代码,但在引用中,只有“SpecificMethod()”和“CommonlyUsedMethod()”两个词…我现在将启动一个新的干净的解决方案,以防万一我遗漏了什么,并报告结果。解决方案如下:…基本上:添加(到上面的代码中)一个空接口IsSubscribebase,该接口具有ICallbackBase回调,并由IsSubscribe1继承。此外,在这种情况下,[ServiceContract]在任何地方都不是必需的