asp.netに2つのWebアプリケーションと1つのWebサービスアプリケーションがあります(すべてのホストは同じサーバーにありますが、すべてドメインが異なります)(例:1番目のアプリの場合は213.74.99.50:9090、2番目のアプリの場合は213.74.99.50:9091、213.74. Web サービスの場合は 99.50:9093)
すべてのアプリケーションで同じセッションを使用したい。
最初の Web アプリでログインし、次に 2 番目のアプリで Web サービスからログイン データを取得します。
私はStateServerモードを使用しています.machinekeysに同じキーを使用しています.global.asaxでもすべてのアプリ名を同じにします.
インターネットエクスプローラーでは問題ありません。すべてが正常に動作します。すべてのアプリケーションで同じセッションを使用できます。
しかし、これを 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;
}
2 番目のアプリケーションでセッションを読み取る
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を使用して、すべてのアプリのWeb構成も追加します
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>
このようにして、Web アプリケーションで同じセッションを使用できますが、Web サービスでは機能しません。
この問題を解決する方法はありますか
私は何かに気づきました。(Web アプリケーションからではなく) Chrome から直接 Web サービスを呼び出すと、セッションは正常に機能します。しかし、jquery.ajax メソッドから webservice を呼び出すと、セッションに到達できません。
クロムで異なるCookieキーを使用するJquery ajaxだと思います。