gpt4 book ai didi

c# - 未在客户端调用 WCF 回调并在服务器端挂起

转载 作者:行者123 更新时间:2023-11-30 14:57:19 31 4
gpt4 key购买 nike

我有一个 WCF 服务,它在常规客户端-> 服务器调用方面工作得非常好。然而,我试图在服务中引入一个简单的回调,但它不起作用......最终我不确定我哪里出了问题所以让我向您展示设置并告诉您我所知道的。

1) 契约(Contract)

public interface IPIRSCallbackService
{
[OperationContract]
void OnCallback();
}

[ServiceContract(CallbackContract = typeof(IPIRSCallbackService))]
public interface IPIRSService
{ etc...

2) 服务器合约实现

注意:我检查了回调 channel 的状态,它是“打开的”——不过不确定这值多少钱。

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]
class PIRSService : IPIRSService
{

public PIRSService()
{
callback = OperationContext.Current.GetCallbackChannel<IPIRSCallbackService>();
var x = ((ICommunicationObject)callback).State;
callback.OnCallback(); // HANGS HERE
}
etc.

3) 客户端——创建代理

现在,这可能不是您会看到的常见方式,因为我正在使用 ViewModelLocator 将服务注入(inject)我的 View 模型......但我确信这不会导致问题......并注意正常服务调用工作绝对正常。

ViewModelLocator 注册服务实例

       SimpleIoc.Default.Register<PIRSService>(() =>
{
IPIRSCallbackService callback = new PIRSCallbackService();
InstanceContext context = new InstanceContext(callback);
return new PIRSService(context, "PIRSClient");
}, true);

SimpleIoc.Default.Register<IPIRSService>(() =>
{
return SimpleIoc.Default.GetInstance<PIRSService>();
}, true);

4) 连接到服务

    DuplexChannelFactory<IPIRSService> channelFactory = new DuplexChannelFactory<IPIRSService>(callbackContext, endpointConfigName);
channelFactory.Credentials.UserName.UserName = userName;
channelFactory.Credentials.UserName.Password = password;
proxy = channelFactory.CreateChannel();
((IClientChannel)proxy).Open();

5) 客户端-端点配置

  <endpoint address="net.tcp://localhost:20437/PIRSService" binding="netTcpBinding"
bindingConfiguration="StandardNetTcpBinding" contract="PIRS_Common.Service.IPIRSService"
name="PIRSClient" kind="" endpointConfiguration="" behaviorConfiguration="CustomBehavior">
<identity>
<dns value="WCfServer" />
</identity>
</endpoint>

所以,我不知道为什么没有触发回调契约的客户端实现......因此服务器端对回调方法的调用挂起......因为它正在等待回调完成。我确定这是回调未正确注册的问题......但我不确定我做错了什么。我是否需要在客户端端点或其他任何地方注册回调契约(Contract)?

最佳答案

您可以确保将“ConcurrencyMode.Multiple”添加到实现回调的类的“CallbackBehavior”属性中。

[CallbackBehavior(ConcurrencyMode=ConcurrencyMode.Multiple)] 

回调并发模式引用:
http://blogs.msdn.com/b/dsnotes/archive/2013/09/18/wcf-callback-operations-are-invoked-sequentially.aspx

此外,如果您还没有,您可能需要考虑启用 WCF 跟踪以确保服务器确实在调用客户端回调方法。

WCF 跟踪引用: http://msdn.microsoft.com/en-us/library/ms733025.aspx

关于c# - 未在客户端调用 WCF 回调并在服务器端挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20996994/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com