在chrome中为不同的域使用相同的会话

时间:2013-05-09 13:48:05

标签: asp.net web-services session

我在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密钥。

0 个答案:

没有答案