1

내 ASP 페이지에서을하지 난 히트 세션 변수에 값을 추가 한 후 내 SL 응용 프로그램에 사용자를 리디렉션과 같은 기본 .ASP 페이지를 가지고서버 변수 내 실버 라이트 응용 프로그램

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

myapp.aspx에서 호스팅되는 SL 응용 프로그램에 도착하면 먼저 lsv QueryString이 있는지 확인합니다. 사실 같다면, 그것은 사람이 알고 있나요

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

같은 코드를 사용하여 WCF 서비스를 호출 왜 난 그냥 내 SL 애플 리케이션을 가져 오기 위해 시도 할 때 리디렉션이 더 이상 존재하기 전에 ASP 페이지에 추가 세션 변수?

+1

ASP 세션! = ASP.Net 세션 – SLaks

답변

1

이 답변은 ASP 클래식이 처음으로 방정식에 들어간 이유가 있다고 가정합니다. 아마도 Silverlight가 기존 ASP 사이트에 도입되기 때문입니다. 문제는 대부분의 Silverlight 클라이언트 - 서버 예제가 서버에 .NET WCF를 포함한다는 것입니다.

문제의 해답은 WCF 서비스를 사용하여 세션 데이터를 가져 오지 않는 것입니다. 대신 간단한 ASP 페이지를 사용하십시오. 간단한 XML 구조를 사용하여 원하는 세션 데이터를 Silverlight 응용 프로그램에 전달하는 것은 상당히 간단합니다. XML을 단순 클래스로 역 직렬화하는 데 사용할 수있는 DTO 클래스를 사용하십시오. 이런 식으로 뭔가 :

(경고 : 공기 코드) 실버 라이트에서

<% 
    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 
%> 

: 일부 UI 또는 뷰 모델에서 이제

[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)); 
    } 

} 

당신이

 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

Silverlight에서는 asp.net 세션 변수를 사용할 수 없습니다. 그들은 서버에만 있습니다.

Check this simple workaround. 도움이 될지도 모릅니다.

+0

그래서 WCF 서비스를 사용하여 세션 변수를 가져옵니다. default.asp에서 myapp.aspx로 이동하면 myapp.aspx에서 한 번 더 이상 세션. 왜 이런거야? – Josh

+0

내 실수. SLaks 상태로 ASP! = ASP.Net. 따라서 .asp와 .aspx간에 기본적으로 호환되지 않는 기술이므로 다른 방법으로 정보를 전달해야합니다. 예를 들어 쿼리 문자열을 사용할 수 있습니다. 쿼리 문자열을 읽고 있다고하더라도 세션 컬렉션을 읽으려고합니다. 쿼리 문자열을 읽으려면 Page.Request.QueryString [ "lsv"]와 같은 것을 사용하십시오. – NestorArturo

+0

혼란 스럽습니다. 쿼리 문자열과 세션 데이터를 모두 사용하고 있습니다. 쿼리 문자열 값은 wcf 서비스를 호출하여 세션 데이터를 가져 오도록 내 앱에 지시합니다. 문제는 리다이렉트 바로 전에 세션 데이터를 분명하게 넣었음에도 세션 데이터가 없다는 것입니다. – Josh