簡體   English   中英

回調中的WCF服務超時

[英]WCF Service timeout in Callback

我正在嘗試與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響應並繼續。

噓...

服務器端:

[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 { ... }

我不確定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;
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM