我正在尝试使用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响应并继续。
...啧
答案 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;
}
}