【问题标题】:WCF callback is not happening in client客户端中未发生 WCF 回调
【发布时间】:2016-01-14 06:53:55
【问题描述】:

我尝试为我的测试自动化实施 WCF 双工服务。服务器调用正常,但没有回调客户端方法。我已经浏览过其他博客和 stacoverflow。将 Isoneway 属性设置为 true,将并发模式设置为可重入,并将同步上下文设置为 false。以前它工作正常。我不知道是什么导致了这个问题。 在这个服务契约中,增加了回调

[ServiceContract(CallbackContract=typeof(ICollaborationServiceCallBack),SessionMode=SessionMode.Required)]
    public interface ICollaborationInfrastructureService
    {

在测试中,初始化代理

[TestFixture]
[CallbackBehavior(UseSynchronizationContext = false, ConcurrencyMode = ConcurrencyMode.Reentrant,IncludeExceptionDetailInFaults=true)]
public class SAF_TestCollaboration : TestFixtureBase, ICollaborationInfrastructureServiceCallback
{
    private SfdTestSteps steps = null;
    private CollaborationInfrastructureServiceClient client = null;  
    private SfdTask task = null;
    protected override void TestFixtureSetupBegin()
    {
        base.TestFixtureSetupBegin();
        steps = new SfdTestSteps();
        task = new SfdTask();
        PrepareEnvironment();
        client = new CollaborationInfrastructureServiceClient(new InstanceContext(this));
    }

    public void Login(string username,string password)
    {
        TestMonitor.Do("xyz","xyz", "xyz",
            () =>
            {
                xyzzzzz.....
                OperationContext.Current.GetCallbackChannel<ICollaborationServiceCallBack>().DoLoginIn("xyz", "xyz");
            });
    }

方法在测试端实现...

    public void DoLoginIn(string username, string password)
    {
        steps.Login.UserName = username;
        steps.Login.Password = password;
        steps.Login.DoLogin();
    }

【问题讨论】:

  • 信息不足。向我们展示您尝试回调客户端的代码。
  • 不,把这个放在问题中,而不是评论
  • 我更新了问题,请看一下...
  • TestMonitor.Do 是否在不同的线程上运行委托?
  • 是的,行动委托

标签: wcf


【解决方案1】:

问题是OperationContext.Current 绑定到线程。如果你切换到不同的线程OperationContext.Current 将是空的。

试试这个:

   public void Login(string username,string password)
    {
        var callbackChannel = OperationContext.Current.GetCallbackChannel<ICollaborationServiceCallBack>();
        TestMonitor.Do("xyz","xyz", "xyz",
            () =>
            {
                xyzzzzz.....
                callbackChannel.DoLoginIn("xyz", "xyz");
            });
    }

【讨论】:

  • @Varun Tiwari - 不客气。不要忘记按我的答案旁边的勾号。
  • 另一个问题是,我在几个 API 中调用了这个 TestMonitor.Do(...),所以每个 where 函数都将通过 Action 委托调用,所以问题仍然存在。我想使用相同的代码库,因为如果我必须纠正这一点,将会有巨大的变化。请建议我如何解决这个问题。例如,上面您可以看到一级 TestMonitor.Do(...) 调用,在此内部,将调用更多的 API,它们再次使用 TestMonitor.Do(...)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多