- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
好吧,我对这件事束手无策。我有一个 WCF 双工服务。以下是架构的工作原理:
问题是当服务调用那个回调时,似乎没有任何反应。没有错误,什么都没有。经过进一步调查,我在服务器跟踪中发现了一个异常:
The I/O operation has been aborted because of either a thread exit or an application request
这发生在尝试执行回调之后。
客户端永远不会收到响应或关闭。所发生的一切是,由于初始请求是在与主线程不同的线程上发出的,它只会永远等待该线程完成。
最奇怪的是,如果我尝试在客户端调用的操作中调用回调,而不进入另一个线程,一切正常 - 回调被成功调用,这让我相信我已经配置服务正确,但存在线程/死锁问题。
以下是我调用该服务的方式:
SubmissionServiceClient client = CreateClientInstance();
client.Open();
Guid executionId = await client.SubmitAsync(submission);
submissionCompletionSource.Task.Wait(); //waits for the callback to be called (I omitted the extra wiring code for better readability)
client.Close();
private SubmissionServiceClient CreateClientInstance()
{
NetHttpBinding binding = new NetHttpBinding();
binding.WebSocketSettings.TransportUsage = WebSocketTransportUsage.Always;
EndpointAddress endpointAddress = new EndpointAddress("ws://localhost:9080/SubmissionRouter");
InstanceContext instanceContext = new InstanceContext(this);
SubmissionServiceClient submissionServiceClient = new SubmissionServiceClient(instanceContext,binding,endpointAddress);
return submissionServiceClient;
}
这是回调操作:
public void SubmissionProcessed(SubmissionResultDto result)
{
submissionCompletionSource.TrySetResult(result);
}
这是客户端调用的服务操作:
public Guid Submit(SubmissionDto submission, ISubmissionCallback callback)
{
ExecutionDto execution = new ExecutionDto()
{
Id = Guid.NewGuid(),
Submission = submission
};
RequestExecution(execution); //Queues the execution of the operation
submissions.Add(execution.Id, callback);
return execution.Id;
}
这是服务调用客户端回调的地方(此方法在与发出初始请求的线程不同的线程上执行):
ISubmissionCallback callback = submissions[submissionResult.ExecutionId];
callback.SubmissionProcessed(submissionResult);
服务行为:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant)]
正如您在提交时看到的那样,该服务将回调存储在字典中,并与一个 id 配对,稍后它会使用它来检索回调并调用它。我相信它失败的原因是因为我试图在不同的线程上执行此操作。
编辑:我向服务添加了一个 Ping 操作,它调用另一个线程,该线程挂起 3 秒,然后在客户端上调用一个 Pong 函数。
public void Ping()
{
var callback = OperationContext.Current.GetCallbackChannel<ISubmissionCallback>();
Task.Run(() =>
{
System.Threading.Thread.Sleep(3000);
callback.Pong();
});
}
客户: 类(class)计划 { 静态无效主要(字符串[]参数) { NetHttpBinding 绑定(bind) = new NetHttpBinding(); binding.WebSocketSettings.TransportUsage = WebSocketTransportUsage.Always; EndpointAddress endpointAddress = new EndpointAddress("ws://localhost:9080/SubmissionRouter"); InstanceContext instanceContext = new InstanceContext(new Callback()); SubmissionServiceClient submissionServiceClient = new SubmissionServiceClient(instanceContext, binding, endpointAddress);
submissionServiceClient.Ping();
Console.Read();
}
public void SubmissionProcessed(SubmissionResultDto result)
{
throw new NotImplementedException();
}
class Callback : ISubmissionServiceCallback
{
public void Pong()
{
Console.WriteLine("Pong!");
}
public void SubmissionProcessed(SubmissionResultDto result)
{
}
}
}
这确实成功了。我设法在客户端收到了我的答复。我现在正式完全迷路了。
最佳答案
如果您使用 submissionCompletionSource.Task.Wait();
阻塞 UI 线程,这将导致您的死锁。默认情况下,WCF 回调发生在 UI 线程上,您可以使用 CallbackBehaviorAttribute
[CallbackBehaviorAttribute(UseSynchronizationContext=false)]
class Callback : ISubmissionServiceCallback
{
public void Pong()
{
Console.WriteLine("Pong!");
}
public void SubmissionProcessed(SubmissionResultDto result)
{
}
}
或者不阻塞 UI 线程。
SubmissionServiceClient client = CreateClientInstance();
client.Open();
Guid executionId = await client.SubmitAsync(submission);
await submissionCompletionSource.Task; //awaits for the callback to be called without blocking the UI.
client.Close();
关于c# - 从不同线程调用时,WCF Duplex 回调方法从不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33602528/
问题(可从 nodeschool.io/#stream-adventure 下载) Write a program that exports a function that spawns a proc
我正在设计我的所有客户都将连接到的 2 个 WCF 服务。其中一项服务将是通知服务。 我希望每个客户端都连接到服务,订阅它,然后使用双工回调接口(interface)接收通知(服务将触发客户端中的“通
我不能否认双工异步调用的性能优势,但有些事情让我感到谨慎。 我担心的是,给定一个实例化的客户端对象,WCF 是否能够判断哪个特定的客户端服务实例将接收回调参数? 谁能告诉我这是否是个好主意?如果不是,
我正在努力处理这个双工 WCF 服务,该服务会调用该服务以获取大量数据。我正在使用 wsDualHttpBinding ,它可以工作但速度很慢。我进行了概要分析,大部分时间都被序列化程序和身份验证过程
如何从服务 (WCF 3.5) 中查找双工 HTTP 绑定(bind)的客户端回调 URL? 感谢任何帮助.. 最佳答案 要在双工 channel 中获得对客户端的回调,您所做的是在您要调用的服务上调
我在 Vista 和 Windows 7 上使用 VS 2008 SP 1 和 Silverlight 3 工具创建了一个嵌入了 Silverlight 项目的 Web 应用程序。 双工服务代码:
好吧,我对这件事束手无策。我有一个 WCF 双工服务。以下是架构的工作原理: 客户端打开到端点的连接并提供回调实现 该服务接受该请求并在其他线程上做一些事情(可能是 1 秒也可能是 2 分钟,这就是我
我正在开发一个使用 WCF 在服务器和客户端之间进行通信的应用程序 服务器具有不断变化的服务数量,以及一个主服务,客户端可以查询有关其他服务的信息,然后使用来自主服务的信息订阅他们想要的服务。 当子服
我们有一个具有多个客户端的 WCF 服务,用于在客户端之间安排操作。它在 XP 上运行得很好。迁移到win7,我只能将客户端连接到同一台计算机上的服务器。此时,我认为这与 IPv6 有关,但我不知道如
我在 .NET 中创建了一个 WCF 双工服务和客户端,它工作正常,也非常好。 现在我想做一个Android客户端。我之前曾将 kSoap 用于 Web 服务,这些对于客户端到服务的连接很有用。 但是
一点背景:我正在构建一个简单的回合制游戏。有一个托管 WCF 服务的服务器和使用 Xamarin.Forms(使用 PCL 库)构建的客户端。所以我想用双工 channel 构建非常简单的“请求-响应
我在 IIS (.NET 4.x) 上托管了一个相当简单的 WCF 双工服务 一个特定的服务方法运行时间很长(1-3 分钟),当这个方法被客户端触发时,我想通过页面上的一个 JQuery 进度条向用户
这是我在 Stackoverflow 上的第一篇文章,希望我做对了。 我是 C++ 新手。 我一直在玩 RtAudio 和 Qt(在 linux、桌面和树莓派上)。 后端是 ALSA。 我的台式计算机
我一直在阅读和试验 WCF,并试图以简单的方式理解其工作原理。所以我的问题是验证和验证我认为正确的内容,但我需要确定:在典型的发布-订阅双工服务中。 1:服务契约 - 这是客户端必须与服务建立的通信路
我正在查看 virtio 驱动程序的代码: https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/tree/drivers/
我已经尝试了多种方法来解决这个练习已经好几天了。我放弃。我在这里做错了什么?如果我使用的事件是“结束”事件并且我没有向管道写入任何内容,为什么会出现“结束后写入”错误?我只是在使用后更改一个对象。或者
我正在移植一个构建在 ACE Proactor 框架之上的应用程序。该应用程序在 VxWorks 和 Windows 上都能完美运行,但无法在内核为 2.6.X.X 的 Linux(CentOS 5.
我正在尝试将 Apache.NMS.WCF 绑定(bind)用于 WCF 应用程序并收到以下错误 - 契约(Contract)需要 TwoWay(请求-答复或双工),但 Binding 'NmsBin
我正在本地主机上制作 WCF 服务应用程序,但在向客户端应用程序添加服务引用时遇到了问题(在同一个 Visual Studio 解决方案中) 我收到一条错误消息:“契约(Contract)需要 Dup
我有一个 WCF 服务和一个 Silverlight 5 客户端。我定义了以下接口(interface): [ServiceContract(Namespace = "Silverlight", Ca
我是一名优秀的程序员,十分优秀!