Сервер вызовов веб-клиента, вызов сервера стороннего производителя, все асинхронно?
У меня есть веб-сайт, который спроектирован с использованием n-слойного подхода. Проблема, с которой я столкнулся, заключается в том, что мне нужен клиент для вызова уровня приложения, а один из других уровней затем вызовет другой веб-сервис в любой точке мира. Другой веб-сервис может занять некоторое время, чтобы вернуться, поэтому я хотел бы сделать, если это возможно, что-то вроде следующего, используя асинхронные запросы:
Клиент - это HTML и JavaScript, уровни сервера написаны на C# (.NET 4.5), сторонние веб-сервисы - это просто веб-сервисы, которые мне нужны.
Как бы вы написали это? Любая помощь будет высоко ценится
2 ответа
Это не похоже на то, что серверный код должен вызывать внешний сервис асинхронно. Я не вижу преимущества в этом.
Конечно, код на стороне клиента будет вызывать код на стороне сервера асинхронно. (AJAX-запрос, например, с использованием jQuery.) И он будет ожидать асинхронной формы ответа этой службы перед обработкой этого ответа. Но поскольку серверный код в этом запросе обслуживает только один запрос, он может делать это синхронно.
Действительно, если код на стороне сервера сам по себе также является асинхронным, то он вернет управление коду на стороне клиента непосредственно перед тем, как у него будет что-то полезное для его передачи. Это означает, что клиентский асинхронный обработчик не может ничего сделать. Вместо этого, когда код на стороне сервера получает ответ от внешней службы, он должен передать этот ответ на код на стороне клиента. Что возможно с веб-сокетами и так далее, но, вероятно, намного сложнее, чем требует эта ситуация.
Только первое звено в цепочке должно быть асинхронным, чтобы обеспечить пользовательский опыт асинхронности, остальная система не должна быть.
Всякий раз, когда у вас есть граница "клиент / сервер", у вас есть возможность сделать сервер асинхронным, а также сделать клиент асинхронным. Эти решения являются независимыми.
Я сделаю предположение, что ваш сторонний веб-сервис является масштабируемым или что у вашего сервера есть и другие задачи, кроме только этого одного запроса. В этом случае я бы рекомендовал, чтобы ваш сервер был асинхронным.
Асинхронное программирование естественно для async
/await
в ASP.NET 4.5. В зависимости от вашего стороннего сервиса, вы можете использовать HttpClient
или async
-совместимые WCF или прокси веб-сервисов. Как ASP.NET MVC, так и WebAPI поддерживают асинхронные вызовы для вашей службы.
На стороне клиента у вас нет выбора; JavaScript в браузере должен быть асинхронным.