Переменные сервера не попадают из моей страницы ASP в мое приложение Silverlight - PullRequest
1 голос
/ 14 февраля 2012

У меня есть такая базовая страница .ASP, как эта, которая при нажатии перенаправляет пользователя в мое приложение SL после добавления значения в переменные сеанса

<!-- Default.htm -->
<html>
<%Session("valuekey")=somevalue%>
<Head>
<META http-equiv="Refresh" content="0; URL=/appdirectory/myapp.aspx?lsv=true"></HEAD>
<Body></Body>
</HTML>

Когда я попадаю в мое приложение SL, размещенное на myapp.aspx, первым думает, что он проверяет lsv QueryString.Если он равен true, он вызывает службу WCF с кодом, подобным

object x = HttpContext.Current.Session["valuekey"];
if(x == null)
{
ServiceError.Message = "No session variable found";
}
else
{
return x.ToString();
}

Кто-нибудь знает, почему переменная сеанса, которую я только что добавил на странице ASP перед перенаправлением, больше не существует, когда мое приложение SL пыталось извлечьэто?

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Этот ответ предполагает, что есть веская причина, почему ASP classic в первую очередь входит в уравнение.Возможно, потому что Silverlight внедряется в существующий сайт ASP.Проблема заключается в том, что в большинстве примеров клиент-сервер Silverlight используется .NET WCF на сервере.

Ответ на вашу проблему заключается в том, чтобы не использовать службу WCF для извлечения данных сеанса.Вместо этого используйте простую страницу ASP.Было бы достаточно просто использовать простую структуру XML для переноса данных сеанса, которые вы хотите, в приложение Silverlight.Используйте класс DTO, который можно использовать для десериализации XML в простой класс.Примерно так:

(предостережение: код воздуха)

 <%
     Dim dom:  Set dom = CreateObject("MSXML2.DOMDocument.3.0")
     dom.loadXML "<SessionData />" 

     AddElem dom.documentElement, "ValueKey", Session("valuekey")
     AddElem dom.documentElement, "SomeOtherValue", Session("othervalue")
     ''# include other session values needed by client here.

     Response.ContentType = "text/xml"
     Response.CharSet = "utf-8"
     dom.save Response

     Sub AddElem(parent, name, value)
         Dim elem: Set elem = parent.ownerDocument.createElement(name)
         parent.appendChild elem
         elem.text = value;
     End Sub
 %>

В Silverlight:

 [DataContract]
 public class SessionData
 {
     [DataMember(Order=1)]
     public string ValueKey {get; set; }

     [DataMember(Order=2)]
     public string SomeOtherValue {get; set; }

     public static void Fetch(Action<string> returnResult, Action<exception> fail)
     {
         WebClient client = new WebClient();
         OpenReadCompletedEventHandler eh = null;
         eh = (s, args) =>
         {
             try
             {
                 var sr = new DataControlSerializer(typeof(SessionData));
                 returnResult((SessionData)sr.ReadObject(args.Result)); 
             }
             catch (Exception e)
             {
                 fail(e);
             }
             finally
             {
                client.OpenReadAsyncCompleted -= eh;
             }
          };
          client.OpenReadAsyncCompleted += eh;
          client.OpenReadAsync(new Uri("../serviceFolder/sessionState.asp", UriKind.Relative));
     }

 }

Теперь в каком-то пользовательском интерфейсе или ViewModel вы делаете

     void SessionData_Available(SessionData sessionData)
     {
          _sessionData = sessionData;
          // Other actions needed once session data has arrived.
     }

     void ReportProblem(Exception e)
     {
          // Some UI change to inform user of failed fetch
     }

...

     SessionData.Fetch(SessionData_Available, ReportProblem);
0 голосов
/ 14 февраля 2012

Ваши переменные сеанса asp.net недоступны для Silverlight.Они живут только на сервере.

Проверьте этот простой обходной путь .Это может помочь вам.

...