我最近在我的服务中添加了一个ping方法,该方法在回调通道上调用pong方法:
public partial class myService
{
public void Ping()
{
OperationContext.Current.GetCallbackChannel<IKeepAliveEvents>().Pong();
}
}
我还在pong方法中添加了回调接口:
namespace myService
{
[ServiceContract]
public interface IKeepAliveEvents
{
[OperationContract(IsOneWay = true)]
void Pong();
}
}
在我的WCF服务的主界面定义中继承了哪些:
[ServiceContract]
public interface IMyServiceEvents : IEvents1, IEvents2, ..., IEvents9, IKeepAliveEvents
{
[OperationContract(IsOneWay = true)]
void TestEvent(string s);
}
然后使用如下:
[ServiceContract(CallbackContract=typeof(IMyServiceEvents)]
public interface IMyService : ISomething1, ISomething2, ..., ISomething13
{
...
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple, MaxItemsInObjectGraph = 2147483647)]
public partial class myService : IMyService, IDisposable, IServiceBehavior, IErrorHandler {
...
}
问题是......当我的WCF服务运行时,它不会让我从接口定义中实现我的客户端应用程序中的pong方法,因为每次我尝试更新服务时它似乎都不存在...并且我确定我正在使用正确的URL更新正确的服务,并确保我使用最新版本的代码,因为我已经能够将调试器附加到我的服务并在Ping方法中放置一个断点它叫Pong。更奇怪的是,Ping方法确实存在让我的客户端使用它,但是Pong方法似乎不想在客户端上显示:
public partial class myClientEndpoint : myServiceCallback {
// I would expect Pong to be implementable here.
}
问题是什么?
答案 0 :(得分:0)
答案实际上是我的IKeepAlive ServiceContract(包含Ping方法)没有将自己的回调契约引用为IKeepAliveEvents ...就像这样:
[ServiceContract(CallbackContract=typeof(IKeepAliveEvents))]
public interface IKeepAlive
{
[OperationContract(IsOneWay = true)]
public void Ping();
}
在MyServiceContract上指定[ServiceContract(CallbackContract=typeof(IMyServiceEvents)]
是不够的。继承只是不会以这种方式与WCF一起工作。