[英]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.