Кажется, что если вы связываете родителя с ребенком, устанавливая родителя на ребенка, а не наоборот, это работает без сбоев.
Так что если вы сделаете:
[child setParent:parent]
вместо
[parent setChildObects:child]
Это должно работать, по крайней мере, работает на iOS 7 и не было никаких проблем с отношениями.
На странице, на которой размещен элемент управления silverlight, вы можете настроить таймер javascript и выполнять вызов ajax обработчику Http (.ashx) каждые 5 минут, чтобы сохранить сессия жива. Убедитесь, что ваш класс Handler реализует IRequiresSessionState
.
Я рекомендую Handler, потому что с ним легче контролировать возвращаемый текст ответа, и он более легкий, чем страница aspx.
Вы также необходимо правильно настроить кеш ответов, чтобы браузер каждый раз выполнял вызов ajax.
UPDATE
Вот пример кода для HttpHandler
public class Ping : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.ContentType = "text/plain";
context.Response.Write("OK");
}
public bool IsReusable
{
get { return true; }
}
}
Затем, если вы используете jQuery, вы можете поместить это на страницу aspx вашего хоста
setInterval(ping, 5000);
function ping() {
$.get('/Ping.ashx');
}
. Интервал указан в миллисекундах, поэтому мой образец будет пинговать каждые 5 секунд, вы, вероятно, захотите, чтобы это было большее число. Fiddler - отличный инструмент для отладки вызовов ajax, если вы его не используете, начните.
На самом деле я нашел довольно интересный прием, который, по сути, встраивает iframe на ту же страницу, что и приложение silverlight. Iframe содержит веб-страницу aspx, которая обновляется каждые (Session.Timeout - 1) минут. Это поддерживает сеанс до тех пор, пока открыто приложение silverlight.
Для этого:
Создайте страницу asp.net под названием «KeepAlive.aspx». В разделе заголовка этой страницы добавьте следующее:
<meta id="MetaRefresh" http-equiv="refresh" content="18000;url=KeepAlive.aspx" runat="server" />
<script language="javascript" type="text/javascript">
window.status = "<%= WindowStatusText%>";
</script>
В код файла добавьте следующее:
protected string WindowStatusText = "";
protected void Page_Load(object sender, EventArgs e)
{
if (User.Identity.IsAuthenticated)
{
// Refresh this page 60 seconds before session timeout, effectively resetting the session timeout counter.
MetaRefresh.Attributes["content"] = Convert.ToString((Session.Timeout * 60) - 60) + ";url=KeepAlive.aspx?q=" + DateTime.Now.Ticks;
WindowStatusText = "Last refresh " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString();
}
}
Теперь на той же странице, что и приложение silverlight, добавьте следующее:
<iframe id="KeepAliveFrame" src="KeepAlive.aspx" frameborder="0" width="0" height="0" runat="server" />
Теперь сеанс asp.net будет остаются активными, пока используется приложение silverlight!
Подход ajax ping / HttpHandler хорош, но функция JQuery $ .get ожидает результат json и выдает ошибку синтаксического анализа javascript.
Я изменил Ping HttpHandler, чтобы он возвращал "{ } "вместо" ОК ", и это сработало лучше.