Изменить идентификатор сессии ASP.Net - вызов из настольного приложения через AJAX - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть старое приложение VB6 - мне нужно выложить на сайт ASP.net через веб-браузер.У меня есть браузер, открывающий и успешно вызывающий сайт ASP.Мне нужно приложение VB6, чтобы знать, когда сессия веб-браузера закрыта.Форма приложения VB (или кнопка сохранения) должна быть отключена, когда открыт сеанс веб-браузера.(Я не хочу использовать идентификатор процесса Windows, чтобы проверить это.)

Я думаю:

  • Возможно, междоменные куки?(безопасность?)
  • У меня есть приложение VB6, которое может вызывать сервер WebMethods
  • Сохранение идентификатора сеанса в базе данных, которая используется в обоих приложениях?

Некоторые советы были бы превосходными.Большое спасибо.

1 Ответ

0 голосов
/ 15 февраля 2019

Внутренние приложения компании.

Настольное приложение (VB6)

  • Код, позволяющий приложениям VB6 связываться со службой Asp.На любой странице Asp.Net создайте дополнительный [WebMethod], в этом случае метод «IsWindowOpen» был добавлен на страницу test.aspx (см. Красный текст ниже)
  • Отправьте сообщение JSON в ASP.NetСлужба для запроса, если установлена ​​переменная сеанса WINDOWS_STATUS (это говорит нам, открыто ли окно браузера \ закрыто).
  • При отправке на сайт Asp.Net с параметрами (идентификатор плана и т. д.)мы отправим дополнительный параметр для 'Session Id'.

  • Произвольная генерация идентификатора сеанса в приложении VB6 [случайным образом: 24 символа длиной, нижний регистр и цифры от 0 до 5], это повторяет, как собирается среда Asp.Netсоздать свой собственный идентификатор сессии для связи между HTML и C #.Затем мы переопределим идентификатор сессии Asp.Net, данный нам Asp.Net, с помощью нашего собственного произвольно сгенерированного идентификатора сессии.

Проверьте, установлена ​​ли переменная сеанса ASP.Net в VB6:

Private Sub Command1_Click()
    Dim objHTTP As Object
    Dim Json As String
    Dim result As String

    ' === Check if Browser Session is open ===
    Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
    url = "http://dub-iisdev/SessionTest/test.aspx/IsWindowOpen"

    objHTTP.open "POST", url, False

    objHTTP.setRequestHeader("cookie") = "ASP.NET_SessionId=" + txtCookie.Text ' Required twice
    objHTTP.setRequestHeader("cookie") = "ASP.NET_SessionId=" + txtCookie.Text ' Required twice

   objHTTP.setRequestHeader "Content-type", "application/json"

   objHTTP.send (Json)

   result = objHTTP.responseText

   txtOutput.Text = result

   Set objHTTP = Nothing
End Sub

ASP.Net

Здесь нам понадобится несколько деталей: Небольшой метод для установки идентификаторов сеансов ASP.Net Небольшая закрывающая страница aspx, котораябудет запускать некоторый код при выходе из браузера, а также некоторые дополнительные методы C # и JavaScript на наших существующих страницах.

1.Установка идентификатора сеанса:

Копировать переменную из старого сеанса в новое местоположение

protected void ReGenerateSessionId(string newsessionID)
{
    SessionIDManager manager = new SessionIDManager();
    string oldId = manager.GetSessionID(Context);
    string newId = manager.CreateSessionID(Context);
    bool isAdd = false, isRedir = false;
    manager.RemoveSessionID(Context);
    manager.SaveSessionID(Context, newsessionID, out isRedir, out isAdd);

    HttpApplication ctx = (HttpApplication)HttpContext.Current.ApplicationInstance;
    HttpModuleCollection mods = ctx.Modules;
    System.Web.SessionState.SessionStateModule ssm = (SessionStateModule)mods.Get("Session");
    System.Reflection.FieldInfo[] fields = ssm.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
    SessionStateStoreProviderBase store = null;
    System.Reflection.FieldInfo rqIdField = null, rqLockIdField = null, rqStateNotFoundField = null;

    SessionStateStoreData rqItem = null;
    foreach (System.Reflection.FieldInfo field in fields)
    {
        if (field.Name.Equals("_store")) store = (SessionStateStoreProviderBase)field.GetValue(ssm);
        if (field.Name.Equals("_rqId")) rqIdField = field;
        if (field.Name.Equals("_rqLockId")) rqLockIdField = field;
        if (field.Name.Equals("_rqSessionStateNotFound")) rqStateNotFoundField = field;

        if ((field.Name.Equals("_rqItem")))
        {
            rqItem = (SessionStateStoreData)field.GetValue(ssm);
        }
    }
    object lockId = rqLockIdField.GetValue(ssm);

    if ((lockId != null) && (oldId != null))
    {
        store.RemoveItem(Context, oldId, lockId, rqItem);
    }

    rqStateNotFoundField.SetValue(ssm, true);
    rqIdField.SetValue(ssm, newsessionID);
}

Ваша первая целевая страница установит новый параметр идентификатора сеанса (из VB6), отправляемый на сервер–используя вышеприведенный класс ReGenerateSessionId.

После выполнения этого кода экземпляр Asp.Net и наш экземпляр VB6 будут иметь тот же идентификатор сеанса для HTTP-связи

protected void Page_Load(object sender, EventArgs e)
{
    // Simulate Session ID coming in from VB6...
    string sessionId;
    Random rnd = new Random();
    sessionId = "asdfghjklqwertyuiop12345" [24 char - a to z (small) & 0-5]
    // Set new session variable and copy variable from old session to new location
    ReGenerateSessionId(sessionId);

    // Put something into the session
    HttpContext.Current.Session["SOME_SESSION_VARIABLE_NAME"] = "Consider it done!";
}

2.Открыть \ закрыть браузер

Одна из страниц ASP.Net должна иметь три новых метода WebMethods: SetOpenWindow, SetClosingWindow и IsWindowOpen

Открытие браузера:

C #.SetOpenWindow: это будет вызываться из ваших первых (или любых необходимых) HTML-страниц через .ready JavaScript.Когда страница загрузится, JavaScript просто вызовет Ajax-вызов веб-метода SetOpwnWindow.Метод установит переменную сеанса WINDOW_STATUS в значение OPEN.

[WebMethod()]
[ScriptMethod(UseHttpGet = false)]
public static string SetOpenWindow()
{
    HttpContext.Current.Session["WINDOW_STATUS"] = "OPEN";
    return "Status:" + HttpContext.Current.Session["WINDOW_STATUS"];
}

ASPX.Вызовите SetOpenWindow из Ajax после загрузки страницы.Это устанавливает для WINDOW_STATUS значение OPEN

<script src=”Scripts/jquery-1.4.1.js" type="text/javascript"></script>
<script type="text/javascript">
    $(document).ready(function () {

        jQuery.ajax({
            url: 'test.aspx/SetOpenWindow',
            type: "POST",
            dataType: "json",
            data: "",
            contentType: "application/json; charset=utf-8",
            success: function (data) {}//alert(JSON.stringify(data));
        });

        $("#form1").submit(function () {
            submitted = true;
        });    
    });
</script>

Закрытие браузера:

На страницах, где окно браузера может быть закрыто, вызовите JavaScript, чтобы перехватывать при закрытии окна браузера(удобно, чтобы добавить это на свою главную страницу, а не на каждую страницу!).Это вызывает страницу aspx ClosingSessionPage для запуска веб-метода SetClosingWndow:

<script type=”text/javascript”>
    var submitted = false;

    function wireUpWindowUnloadEvents() {
        $(document).on('keypress', function (e) { if (e.keyCode == 116) { callServerForBrowserCloseEvent(); } }); // Attach the event keypress to exclude the F5 refresh
        $(document).on("click", "a", function () { callServerForBrowserCloseEvent(); }); // Attach the event click for all links in the page
    }

    $(window).bind("onunload", function () { if (!submitted) { callServerForBrowserCloseEvent(); event.preventDefault(); } });
    $(window).bind("beforeunload", function () { if (!submitted) { callServerForBrowserCloseEvent(); event.preventDefault(); } });
    window.onbeforeunload = function () { if (!submitted) { callServerForBrowserCloseEvent(); } };
    window.onunload = function () { if (!submitted) { callServerForBrowserCloseEvent(); } };
    $(window).bind("onunload", function () { if (!submitted) { callServerForBrowserCloseEvent();event.preventDefault();} });

    function callServerForBrowserCloseEvent() {
        window.open("ClosingSessionPage.aspx", "Closing Page", "location=0,menubar=0,statusbar=1,width=1,height=1"); }

    function btn_onclick() { open(location, '_self').close(); }

</script>

Приведенный выше метод JavaScript JavaScript перенаправляет на страницу aspx закрытия для запуска некоторого ajax, а затем закрывает сам себя - Ajax вызывает SetClosingWindow переменную сеанса WINDOW_STATUS дляЗАКРЫТО.

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server" title="Closing Session">

    <script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            jQuery.ajax({
                url: 'test.aspx/SetClosingWndow',
                type: "POST",
                dataType: "json",
                data: "",
                contentType: "application/json; charset=utf-8",
                success: function (data) {
                    window.close();
                } });  });
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <p>Closing browser session, please wait.</p>
    </form>
</body>
</html>

C # SetClosingWindow Вызывается из Ajax JavaScript, когда окно браузера закрывается и устанавливает для WINDOW_STATUS значение ЗАКРЫТО:

[WebMethod()]
[ScriptMethod(UseHttpGet = false)]
public static string SetClosingWndow()
{
    HttpContext.Current.Session["WINDOW_STATUS"] = "CLOSED";
    ScriptManager.RegisterClientScriptBlock((Page)(HttpContext.Current.Handler), typeof(Page), "closePage", "window.close();", true);
    return "Status:" + HttpContext.Current.Session["WINDOW_STATUS"];
}

3.Браузер открыт?

ASP.Net WebMethod вызывается VB6 всякий раз, когда ему нужно узнать, открыто ли окно браузера или нет.

[WebMethod()]
[ScriptMethod(UseHttpGet = false)]
public static string IsWindowOpen()
{
    string isWindowOpen = HttpContext.Current.Session["WINDOW_STATUS"] != null ? HttpContext.Current.Session["WINDOW_STATUS"].ToString() : "CLOSED";

    return "IsWindowOpen:" + isWindowOpen;
}
...