Хорошо, вернитесь на секунду.
Если вы хотите, чтобы люди могли вызывать асинхронно, тогда они контролируют, а вы просто отвечаете. Если вы хотите, чтобы асинхронная работа выполнялась на вашей стороне, то вам нужно установить другую схему. Один шаблон состоит в том, чтобы установить метод, который вызывает работу, а затем другой метод, чтобы увидеть статус работы. Первый метод возвращает некоторый тип токена / идентификатора, который можно использовать для проверки состояния другого вызова. Затем у вас есть третий способ получить результаты. Это все зависит от клиента.
Теоретически вы можете настроить механизм обратного вызова, но клиент должен иметь средство для получения ответа, что является услугой на его стороне. Это более сложный и менее "публичный API" по своей природе, но он может работать с клиентами.
Неоднородная природа системы не должна быть фактором. И вы можете установить оба шаблона, чтобы клиенты, у которых есть веб-служба, которая может принять ответ, могли сработать и забыть, в то время как другие опрашивают.
Единственным недостатком опроса является то, что вы добавляете больше веса на свою сторону, поэтому установите правильные ожидания и будьте готовы подавить парня, который делает что-то вроде этого:
while(thread.NoComplete())
{
pollTheCrapOutofService();
}
Если вы можете обойти гетерогенные среды (открытые стандарты и др.) И можете форсировать .NET, у вас есть другие варианты, как упоминал Крейг.