Я пытался выяснить, как реализовать отмену вызова WCF на основе нового механизма .NET 4.5 CancellationToken. Все найденные мной образцы не основаны на WCF и не пересекают границу сервиса.Как отменить вызов async WCF?
Моя служба:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class MyService : IMyService
{
public void LongOperation()
{
// do stuff that takes ages...
// please cancel me!
}
}
Мой клиент (Desktop App):
Использование автоматического сгенерированные прокси:
private async void DoLongRunningTaskAsync()
{
var asyncTask = _myService.LongOperationAsync();
await asyncTask;
}
Как отменить эту задачу? Просьба представить конкретный пример, применимый к ФОС на .NET 4.5+
EDIT:
ответы ниже, кажется, указывают, что его невозможно по техническим причинам. Итак, представьте, я делаю свою услугу ContextMode=Session
, затем устанавливаю статическую переменную (в отдельном вызове службы) под названием cancellationPending=true
, мой первоначальный вызов все еще работает на этом этапе и периодически проверяет эту переменную. Неужели я все еще не смогу отменить? было бы все еще невозможно? если да, то почему?
Ответил здесь, я думаю: https://stackoverflow.com/questions/3039323/whats-the-best-way-to-cancel-an-asynchronous-wcf-request –
Согласен, ответил там. Я написал ниже довольно то же самое, но с большим количеством слов. – Mimas
Ваше решение в редактировании выглядит нормально. Вы можете попробовать проверить, работает ли он в прототипе. Мой ответ основывался на предположении, что после его запуска (если вы используете wcf с привязкой к сети) невозможно остановить HTTP-вызов с клиентской стороны. Как только запрос ушел, он исчез. Поэтому я не вижу возможности, как WCF может получить это ограничение с помощью одного вызова. Но, как вы описали, с двумя независимыми вызовами и общей переменной на стороне сервера она может работать. Я сомневаюсь, что это реализовано nativly. Но я честно не знаю. – Fabian