WCF и Silverlight >> pollingDuplexHttpBinding >> Вызов веб-служб из silverlight при закрытии браузера
У меня есть WCF-сервер и клиент Silverlight, использующий связывание pollingDuplexHttpBinding.
Я хочу закрыть соединение и вызвать метод операции EndSession, который очищает пользователя от
список активных пользователей и закрыть сеанс (IsTerminating = true
)
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = true)]
void EndSession();
в соответствии с этим вы не можете вызвать операцию wcf для события Application_Exit, это также дает
решение, которое мне кажется "2 очень шумным",
Какие у меня варианты здесь? Это единственный способ?
1) Используя решение для связи?
2) Сервер работает метод каждые X секунд, чтобы проверить состояние дуплексного объекта жив?
(((ICommunicationObject)clientContract.Value).State != CommunicationState.Opened
3) Другое?! Простое встроенное решение? Почему Silverlight это АД?!
1 ответ
Это решение, которое я только что опробовал и которое работает. Его ядро было размещено в комментариях по ссылке с вашего вопроса!:)
Silverlight App.Exit
событие:
private void Application_Exit(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(App.SessionId))
return;
var page = HtmlPage.Document.DocumentUri;
UriBuilder builder = new UriBuilder();
builder.Scheme = page.Scheme;
builder.Host = page.Host;
builder.Port = page.Port;
builder.Path = page.LocalPath;
string request = builder.Uri.ToString();
request += "?closing=" + App.SessionId;
System.Windows.Browser.ScriptObject obj = System.Windows.Browser.HtmlPage.Window.CreateInstance("XMLHttpRequest");
obj.Invoke("open", "POST", request, false);
obj.Invoke("setRequestHeader", "Content-Type", "application/x-www-form-urlencoded");
obj.Invoke("send", "");
}
Приведенный выше код отправляет запрос на страницу, на которой размещен объект Silverlight, который является страницей ASPX и имеет следующий код позади:
protected void Page_Load(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(this.Request.QueryString["closing"]))
chatSvc.Quit(this.Request.QueryString["closing"]);
}
chatSvc
должно, очевидно, быть ссылкой на ваш сервис и Quit
любой метод, который вы хотите вызвать, когда клиент закрывается. Вы можете передать необходимые параметры через строку запроса.
Это не красиво, я признаю, но это работает.
РЕДАКТИРОВАТЬ: причина, я не использую DocumentUri
напрямую, потому что я использую инфраструктуру навигации для своего приложения Silverlight.