【发布时间】:2019-07-11 03:58:45
【问题描述】:
我正在使用 WCF 进行双工通信。意图是能够在客户端应用程序和 Windows 服务之间来回发送消息。来自客户端应用程序的通信工作正常,但每当我尝试获取回调服务时,尝试使用回调通道从服务返回到客户端的通信都会失败,并出现 InvalidCastException。
服务合同:
[ServiceContract(CallbackContract=typeof(IPipeListenerCallbackService), SessionMode=SessionMode.Required)]
public interface IPipeListenerService
{
[OperationContract(IsOneWay=true)]
void SendMessage(string message);
}
[ServiceContract]
public interface IPipeListenerCallbackService
{
[OperationContract(IsOneWay=true)]
void SendMessage(string message);
}
实施:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class PipeListenerService : IPipeListenerService
{
public void SendMessage(string message)
{
//do something...
}
public IPipeListenerCallbackService Callback
{
get
{
return OperationContext.Current.GetCallbackChannel<IPipeListenerCallbackService>();
}
}
}
托管/打开 WCF ServiceHost 的服务代码:
try
{
PipeListenerService service = new PipeListenerService();
Uri pipeLocation = new Uri("net.pipe://localhost/" + this.PipeName);
this.pipeServiceHost = new ServiceHost(service, pipeLocation);
NetNamedPipeBinding binding = new NetNamedPipeBinding();
this.pipeServiceHost.AddServiceEndpoint(typeof(IPipeListenerService), binding, "MessagePipe");
this.pipeServiceHost.Open();
}
catch (Exception ex)
{
//do proper error handling here
}
在服务代码的其他地方,我要在回调上实际调用 SendMessage,所以我正在执行以下操作:
PipeListenerService theService = this.pipeServiceHost.SingletonInstance as PipeListenerService;
if (theService != null)
{
theService.Callback.SendMessage(message);
}
在获取回调属性的地方抛出异常。
例外是:
System.InvalidCastException:无法将“System.ServiceModel.Channels.ServiceChannel”类型的对象转换为“CommUtil.IPipeListenerCallbackService”类型。 在 System.ServiceModel.OperationContext.GetCallbackChannelT 在 .PipeListenerService.get_Callback()
作为参考,我在消化 MSDN 上关于 WCF 的双工服务 found here 的文章后创建了这个。我的 google-fu 只显示了“将第二个合同包含为 CallbackContract”之类的链接,我认为我已经在这样做了。
欢迎提出任何建议,包括可能的替代方法。一个限制是,因为客户端应用程序必须作为普通用户(不是管理员/提升权限)运行,我不能简单地做 2 个单独的管道,一个由服务托管,另一个由客户端托管,因为 WCF 安全限制将使客户端的管道对其他进程不可见。
【问题讨论】: