Я пытаюсь справиться с WCF, в частности записывая приложение службы WCF с обратным вызовом.Тайм-аут службы WCF в обратном вызове
Я установил сервис вместе с контрактом обратного вызова, но когда вызывается обратный вызов, приложение отключается.
По существу, от клиента я устанавливаю свойство в классе обслуживания. Сеттер этого свойства, если он не прошел проверку, вызывает обратный вызов и, ну, это время.
Я понимаю, что это, вероятно, для него не асинхронный возврат, но может кто-нибудь, пожалуйста, покажите мне, как это решить?
Благодаря
// 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-ответ и продолжает работу.
Sheesh ...
AJ, спасибо много для ответа. Но я смущен относительно разницы между вашим решением и (из того, что я прочитал) асинхронным обратным вызовом. Абсолютно бесцеремонно, я могу найти googleplex примеров того, как определить асинхронный вызов, но NONE, абсолютно smegging NONE, как вызвать обратный вызов smegging из службы. Все примеры показывают, как определить интерфейс обратного вызова, но никто не показывает, как на самом деле ИСПОЛЬЗОВАТЬ ЭТО. Процитировать Василия Фолти - «Что такое точка bl ** dy». –