ASP.Net PageLoad и управление событиями запускаются дважды при доступе к веб-сайту извне сервера - PullRequest
0 голосов
/ 02 октября 2018

Вот проблема, которая сводила меня с ума в течение нескольких месяцев.Это кажется очень сложным, поэтому я сделал очень простой пример, чтобы продемонстрировать это.

У меня есть веб-сайт, использующий ASP .Net и размещенный на сервере Microsoft, с использованием IIS и базы данных SQL Server.Веб-сайт работает нормально при отладке на локальном сервере или при доступе с внутри сервера.

НО, всякий раз, когда я использую веб-сайт со стороны клиента (= доступ к нему измой компьютер, когда он развернут на моем удаленном сервере), страницы веб-сайта загружаются дважды каждый раз.Значение:

  • При первой загрузке событие Page_Load запускается дважды.
  • Каждый раз, когда я запускаю элемент управления runat = "server", событие Page_Load И соответствующее событие серверазапускаются дважды.

Итак, я создал небольшую веб-страницу, размещенную на том же веб-сайте, но не связанную с другими его страницами (также не используя Site.Master).Вот он:

Код на стороне клиента:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestPostback.aspx.cs" Inherits="Rosalie.TestPostback" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button runat="server" ID="btnTest" OnClick="btnTest_Click" Text="Test" />
    </div>
    </form>
</body>
</html>

Код на стороне сервера:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

namespace Rosalie
{
    public partial class TestPostback : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Directory.Exists(Server.MapPath("Logs")))
                Directory.CreateDirectory(Server.MapPath("Logs"));

            StreamWriter sw = new StreamWriter(Server.MapPath("Logs/Trace.txt"), true);
            sw.WriteLine(DateTime.Now + " " + getPostBackControlName() + " PageLoad\n");
            sw.Flush();
            sw.Close();
        }

        protected void btnTest_Click(object sender, EventArgs e)
        {
            if (!Directory.Exists(Server.MapPath("Logs")))
                Directory.CreateDirectory(Server.MapPath("Logs"));

            StreamWriter sw = new StreamWriter(Server.MapPath("Logs/Trace.txt"), true);
            sw.WriteLine(DateTime.Now + " " + getPostBackControlName() + " ButtonEvent\n");
            sw.Flush();
            sw.Close();
        }

        // Method returning the ID of the control triggering the postback
        private string getPostBackControlName()
        {
            ...
        }
}

Как вы можете видеть, цель состоит в том, чтобы записывать в файл каждый раз, когда вызывается метод события сервера, и поэтому прослеживать поведение сервера.

Теперь, вот файл результата, когда я запускаю эту страницу на моемлокальный сервер, или когда я обращаюсь к нему изнутри сервера релизов, и я делаю один-единственный щелчок по тестовой кнопке:

02/10/2018 15:05:44  PageLoad
02/10/2018 15:05:46 btnTest PageLoad
02/10/2018 15:05:46 btnTest ButtonEvent

Вы можете видеть, что страница была загружена, тогда мой обратный вызов был вызваннажмите на кнопку и запустили соответствующее событие.Это совершенно нормальное и нормальное поведение для этой веб-страницы.

Теперь вот файл результата при выполнении точно таких же шагов, но с удаленного клиентского компьютера:

02/10/2018 15:36:19  PageLoad
02/10/2018 15:36:20  PageLoad
02/10/2018 15:36:28 btnTest PageLoad
02/10/2018 15:36:28 btnTest ButtonEvent
02/10/2018 15:36:28 btnTest PageLoad
02/10/2018 15:36:28 btnTest ButtonEvent

Как вы можетевидите, методы Page_Load и btnTest_Clicked запускаются дважды подряд, как если бы веб-страница загружалась дважды при каждом вызове сервера.

Учитывая простоту кода, я действительно думаю, что это как-то связано сконфигурация веб-сайта или серверная среда, но я не очень разбираюсь в таких вещах.

Я несколько раз искал решение в Интернете, часами пробуя вещи, связанные с чистым программированием, но, похоже, ничегоразрабатывать.Я отчаянно нуждаюсь в решениях.Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...