이 답변은 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);
ASP 세션! = ASP.Net 세션 – SLaks