2011-06-07 3 views
0

У меня есть сайт asp.net, где я вызываю свою службу WCF с помощью jQuery. Иногда служба WCF должна иметь возможность запрашивать у пользователя с подтверждением smth и зависит от выбора пользователя либо продолжить, либо отменить работуWebHttpBinding и обратные вызовы

действительно ли обратный вызов мне помогает? или любая другая идея оценена!

ответ

2

В этом случае контракты обратного вызова не будут работать, поскольку они предназначены для двусторонней связи, и в WebHttpBinding нет дуплекса (есть решение для сценария дуплексного опроса в Silverlight, и я видел одну реализацию в javascript который использует его, но это, вероятно, слишком сложно для вашего сценария).

Что вы можете сделать, так это разделить операцию на две части. Первый из них «начнет» операцию и вернет идентификатор и некоторую дополнительную информацию, чтобы сообщить клиенту, будет ли операция только что закончена, или нужна ли дополнительная информация. В первом случае клиент может затем вызвать вторую операцию, передав идентификатор, чтобы получить результат. Во втором случае клиент снова выполнит вызов, но передаст дополнительную информацию, необходимую для завершения операции (или ее отмены).

+0

Спасибо, Карлос! Могу ли я обернуть эти две операции в транзакции? делает webHttpbinding поддерживает трансакции? BTW Я нашел статью, где парень говорит о таких возможностях, но он не объясняет подробности. Http://jamesstory.wordpress.com/2007/09/04/wcf-and-the-webhttpbinding/ – RinatMegenbaev

+0

Я не думаю, что REST услуги поддержки транзакций. WebHttpBinding определенно нет. В сообщении упоминается, что он смог заставить службу ответить «вызовом функции» (по существу, JSONP), и это решает проблему совершения междоменных вызовов. Но если в вашей функции вы хотите отправить некоторую информацию обратно в службу, вам нужно будет сделать другой звонок. BTW, JSONP не был доступен на 3.5, но он доступен с версии 4.0 фреймворка. – carlosfigueira

2

Ваша архитектура неправильная. Почему:

  • Служба не может переадресовать браузер клиента. Реальный callback по HTTP работает как обратная связь - клиент - это услуга хостинга, вызываемая клиентом. Клиент в вашем случае - браузер - как вы хотите разместить службу в браузере? Как вы хотите открыть порт для входящей связи из браузера? Решения, использующие функциональность «обратного вызова», основаны на объединении службы. Вы можете использовать таймер JavaScript и реализовать свой собственный механизм объединения.
  • Клиентский браузер не может инициировать распределенную транзакцию, чтобы вы не могли начать транзакцию на клиенте. Вы также не можете использовать транзакцию на стороне сервера по нескольким операциям, потому что для нее требуется односеансовый запуск, который, в свою очередь, требует sessinoful канала.
  • Услуги WCF JSON/REST не поддерживают обратный вызов HTTP (дуплексная связь).
  • WCF JSON услуги/REST не строят Объединив решение для вас - вы должны сделать это сами
  • услуги/REST
  • WCF JSON не поддерживают распределенные транзакции
  • WCF JSON услуги/REST не поддерживают sessionful каналов/серверные сессии

Это был технический аспект вашего решения.

Ваше решение больше похоже на сценарий службы Workflow, где вы запускаете рабочий процесс, и работает до некоторой точки, где он ждет ввода пользователя. До тех пор, пока не будет предоставлен вход, рабочий процесс может быть сохранен в базе данных, поэтому обычно пользователь может предоставить вход через несколько дней. Когда вход предоставляется, услуга может продолжаться. Запуск службы и предоставление каждого необходимого ввода моделируется как отдельная операция, вызванная клиентом. Это не обычный сценарий для чего-то, вызванного JavaScript, но это должно быть возможно, потому что вы можете написать пользовательский WebHttpContextBinding для поддержки рабочих процессов. Он по-прежнему не достигнет ситуации, когда пользователь будет автоматически просить что-то - это ваша ответственность, чтобы найти, когда всплывающее окно должно появиться и обработать его.

Если вы оставите стандартный мир WCF, вы можете проверить такие решения, как COMET, который обеспечивает push/callback AJAX.

+0

Большое спасибо Ladislav! Вы хотите сказать, что моя задача может быть достигнута с помощью COMET? – RinatMegenbaev

+0

Возможно, да, но вам все равно придется иметь дело с большими проблемами, потому что то, что вы пытаетесь сделать, не должно выполняться как простое обслуживание. После того, как вы обратились к клиенту, вы должны снова позвонить в службу - возможно, тот же самый экземпляр, чтобы продолжить, и эта часть, вероятно, будет трудной. Что, например, случается, если пользователь покидает ваше приложение до получения обратного вызова? Что произойдет на сервере? Существует много работы, и я не буду так делать. Вы, вероятно, можете разделить свою операцию на несколько небольших вызовов, которые не требуют обратных вызовов. –

+0

Вы правы! Я решил не делать этого. Еще раз спасибо! – RinatMegenbaev

Смежные вопросы