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