我在 asp.net 中有 2 个 Web 应用程序和 1 个 Web 服务应用程序(所有主机都在同一台服务器上,但都有不同的域)(例如:第一个应用程序为 213.74.99.50:9090,第二个应用程序为 213.74.99.50:9091,第二个应用程序为 213.74。 99.50:9093 来自 Web 服务)
我想对所有应用程序使用相同的会话。
在第一个 Web 应用程序登录,然后第二个应用程序从 Web 服务获取登录数据。
我正在使用 StateServer 模式,机器键的键相同,也使 global.asax 中的所有应用程序名称相同
Internet Explorer 没有问题。一切工作正常。我可以在所有应用程序中使用相同的会话。
但是当我在 chrome 或 firefox 中尝试这个时,我必须使用“Access-Control-Allow-Origin=*”
但这不适用于 Web 服务。Web 应用程序在它们之间使用相同的会话。Bur Web 服务不能在 chrome 和 firefox 中使用相同的会话。
这是我的代码:使用第一个应用程序存储会话;
protected void Button1_Click(object sender, EventArgs e)
{
Session["deneme"] = TextBox1.Text;
Label1.Text = Session.SessionID;
}
读取第二个应用程序的会话
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = Session["deneme"]!=null?Session["deneme"].ToString():"yok";
Label2.Text = Session.SessionID;
}
使用 Web 服务返回会话
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[ScriptService]
public class SesDeneme : System.Web.Services.WebService
{
[WebMethod(EnableSession = true)]
public string HelloWorld()
{
return (Session["deneme"] != null ? Session["deneme"].ToString() : "yok") + "____" + Session.SessionID;
}
}
为了对不同的应用程序使用相同的会话,我还更改了所有应用程序的 Web 配置。
<sessionState mode="StateServer"
cookieName="SCS_01"
stateConnectionString="tcpip=localhost:42424"
cookieless="false"
timeout="20"/>
<machineKey decryption="Auto"
decryptionKey="XXXX"
validation="SHA1"
validationKey="YYYY" />
并使所有应用程序名称与 global.asax 相同
protected void Application_Start(object sender, EventArgs e)
{
string applicationName = "MySiteName";
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, applicationName);
}
毕竟,我可以对 Internet Explorer 中的所有应用程序使用相同的会话。
但是使用 Firefox 和 chrome 我还添加了所有应用程序的网络配置
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>
这样我就可以对 Web 应用程序使用相同的会话,但它不适用于 Web 服务。
有没有办法解决这个问题
我注意到了一些东西。如果我直接从 chrome(而不是从 Web 应用程序)调用 Web 服务,会话工作正常。但是如果我从 jquery.ajax 方法调用 webservice 无法访问会话。
我认为 Jquery ajax 在 chrome 中使用不同的 cookie 键。