Этот ответ предполагает, что есть веская причина, почему 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);