回调中的WCF服务超时

时间:2013-11-09 15:50:54

标签: c# wcf callback asynchronous-wcf-call

我正在尝试使用WCF,特别是编写带回调的WCF服务应用程序。

我已经设置了服务以及回调合同,但是当调用回调时,应用程序就会超时。

基本上,从客户端我在服务类中设置属性。此属性的Setter,如果验证失败,则会触发回调,这就是超时。

我意识到这可能是因为它不是异步回调,但有人可以告诉我如何解决这个问题吗?

由于

  // The call back (client-side) interface
public interface ISAPUploadServiceReply
{
    [OperationContract(IsOneWay = true)]
    void Reply(int stateCode);
}

// The Upload Service interface
[ServiceContract(CallbackContract = typeof(ISAPUploadServiceReply))]
public interface ISAPUploadService
{

    int ServerState
    {
        [OperationContract]
        get;
        [OperationContract(IsOneWay=true)]
        set;

实施......

public int ServerState
    {
        get 
        { 
            return serverState; 
        }
        set 
        {
            if (InvalidState(Value))
            {
               var to = OperationContext.Current.GetCallbackChannel<ISAPUploadServiceReply>();
               to.Reply(eInvalidState);
            }
            else serverState = value; 
        } 
    }

我的界面已被修改为(希望)反映异步能力

  // The call back (client-side) interface
public interface ISAPUploadServiceReply
{
   [OperationContractAttribute(AsyncPattern = true)]
    IAsyncResult BeginReply(string message, AsyncCallback callback, object state);
    void EndReply(IAsyncResult result);
}

..和实现(请,我非常,非常,猜测这个 - 除了它不起作用 - '服务器回复了未知响应的运行时错误....'

 public class SAPUploadServiceClient : ISAPUploadServiceReply
{
    private string msg;

    public IAsyncResult BeginReply(string message, AsyncCallback callback, object state)
    {
       // Create a task to do the work
       msg = message;
      var task = Task<int>.Factory.StartNew(this.DisplayMessage, state);
      return task.ContinueWith(res => callback(task));

    }

    public void EndReply(IAsyncResult result)
    {
      MessageBox.Show(String.Format("EndReply"));
    }

    private int DisplayMessage(object state)
    {
       MessageBox.Show(String.Format("Display Message At last here's  the message : {0}", msg));
       return 1;
    }
}

回调由我的服务中的公共方法调用,可从客户端调用

  public void FireCallback(string msg)
    {
        ISAPUploadServiceReply callback = OperationContext.Current.GetCallbackChannel<ISAPUploadServiceReply>();

        callback.BeginReply("Hello from service " + msg, callback.EndReply, null);
    }

界面修改是......

[ServiceContract(CallbackContract = typeof(ISAPUploadServiceReply))]
public interface ISAPUploadService
{
    [OperationContract(IsOneWay = true)]
    void FireCallback(string msg);

请 - 我知道上面看起来非常绝望,这就是它的原因。我只想通过我的WCF服务获得任何回拨工作,以便我可以继续这一进程。简单地调用异步回调应该不难。

我只是想从服务向客户端发起一个事件。这就是我想做的一切。以下可能解释了我想要更清楚地实现的事件过程......

客户端调用服务方法并等待.... 服务方法1承担一些工作(在这种情况下,查询数据库和构建xml响应) 工作完成后,服务将触发一个回调事件,告诉客户端工作已完成,并且XML响应可用。 客户端读取XML响应并继续。

...啧

2 个答案:

答案 0 :(得分:3)

服务器端:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Service1 : IService1 { ... }

执行回调(服务):

var to = OperationContext.Current.GetCallbackChannel<IChatServiceCallback>();
Task.Factory.StartNew(() =>
{
    to.myCallbackFunction( ... );
});

客户端回调:

[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)]
public class MyServiceCallback : IService1Callback { ... }

答案 1 :(得分:2)

我不是百分百肯定,但我记得当我从同一个线程调用回调方法时我遇到了这样的问题。 这应该解决它:

public int ServerState
    {
        get
        {
            return serverState;
        }
        set
        {
            if (InvalidState(Value))
            {
                var to = OperationContext.Current.GetCallbackChannel<ISAPUploadServiceReply>();
                Task.Factory.StartNew(() =>
                    {
                        to.Reply(eInvalidState);
                    });

            }
            else
                serverState = value;
        }
    }