在我的解决方案中,有一些WCF服务,每个服务都实现了自己的回调接口。假设它们被称为:Subscribe1
,ISubscribe1
和ICallback1
等。
在ICallbacks之间共享了一些方法,所以我创建了一个以下接口:
interface ICallback
{
[OperationContract]
void CommonlyUsedMethod();
}
并且我在所有内容中继承了它:ICallback1 : ICallback
,ICallback2 : ICallback
等。并从所有回调接口中删除了CommonlyUsedMethod()
。
现在,在服务端代码上,一切都编译得很好,服务可以像往常一样开始工作。但是,当我更新客户端的服务引用时,CommonlyUsedMethod()从reference.cs文件(ISubscribeCallback部分)中消失,并且不能再用于将数据发送回客户端。
答案 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属性,因此无法告诉序列化程序在另一端需要这样做。因此,当您在客户端上实现它时,它不会显示出来。