我在asp.net中有2个Web应用程序和1个Web服务应用程序(所有主机都在同一台服务器中,但都有不同的域)(例如:第一个应用程序为213.74.99.50:9090,第二个为213.74.99.50:9091和来自网络服务的213.74.99.50:9093)
我想为所有应用程序使用相同的会话。
首先登录网络应用,然后第二个应用从网络服务获取登录数据。
我正在使用StateServer模式,相同的机器密钥,也使global.asax中的所有应用程序名称相同
Internet Explorer没有问题。 Everythings工作正常。我可以在所有应用程序中使用相同的会话
但是当我在chrome或firefox中尝试这个时,我必须使用“Access-Control-Allow-Origin = *”
但这不适用于webservices。 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;
}
使用网络服务返回会话
[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密钥。