1

我在 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 键。

4

0 回答 0