Как часть требования, мне нужно разделить один сеанс между двумя разными приложениями (размещенными на разных машинах) в другой области. ( ex: app1.domain.com и app2.domain.com)
Я использую управление сессиями Sql Server, и оба приложения указывают на один и тот же сервер для хранения сессий. В обоих веб-приложениях ключ компьютера определен одинаково, и оба веб-сервера указывают на один и тот же сервер, где я использую службу State Server для управления сеансом.
Но когда я перенаправляю из одного приложения в другое, я не могу прочитать значение сеанса во втором приложении, которое инициируется в первом приложении. Нужны ваши предложения. Спасибо!
Ниже приведены изменения, которые я делаю на web.config обоих приложений:
<sessionState mode="SQLServer"
cookieless="false"
timeout="20"
sqlConnectionString="data source= DESKTOP-565; initial catalog=ASPState; user id=sa; password=*********;"
allowCustomSqlDatabase="true" />
Также в методе Init () в Global.asax я преобразую имя домена приложения в одно имя, чтобы сеанс можно было разделить между двумя приложениями. (этот метод написан на обоих приложениях
public override void Init()
{
base.Init();
try
{
// Get the app name from config file...
string appName = "/lm/w3svc/5/root";
if (!string.IsNullOrEmpty(appName))
{
foreach (string moduleName in this.Modules)
{
IHttpModule module = this.Modules[moduleName];
SessionStateModule ssm = module as SessionStateModule;
if (ssm != null)
{
FieldInfo storeInfo = typeof(SessionStateModule).GetField("_store", BindingFlags.Instance | BindingFlags.NonPublic);
SessionStateStoreProviderBase store = (SessionStateStoreProviderBase)storeInfo.GetValue(ssm);
if (store == null) //In IIS7 Integrated mode, module.Init() is called later
{
FieldInfo runtimeInfo = typeof(HttpRuntime).GetField("_theRuntime", BindingFlags.Static | BindingFlags.NonPublic);
HttpRuntime theRuntime = (HttpRuntime)runtimeInfo.GetValue(null);
FieldInfo appNameInfo = typeof(HttpRuntime).GetField("_appDomainAppId", BindingFlags.Instance | BindingFlags.NonPublic);
appNameInfo.SetValue(theRuntime, appName);
}
else
{
Type storeType = store.GetType();
if (storeType.Name.Equals("OutOfProcSessionStateStore"))
{
FieldInfo uribaseInfo = storeType.GetField("s_uribase", BindingFlags.Static | BindingFlags.NonPublic);
uribaseInfo.SetValue(storeType, appName);
}
}
}
}
}
}