1

我正在尝试掌握 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 响应并继续。

嘘...

4

2 回答 2

3

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

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;
        }
    }
于 2013-11-09T19:25:00.983 回答
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 { ... }
于 2013-12-11T06:26:40.457 回答