Вот проблема, которая сводила меня с ума в течение нескольких месяцев.Это кажется очень сложным, поэтому я сделал очень простой пример, чтобы продемонстрировать это.
У меня есть веб-сайт, использующий 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 запускаются дважды подряд, как если бы веб-страница загружалась дважды при каждом вызове сервера.
Учитывая простоту кода, я действительно думаю, что это как-то связано сконфигурация веб-сайта или серверная среда, но я не очень разбираюсь в таких вещах.
Я несколько раз искал решение в Интернете, часами пробуя вещи, связанные с чистым программированием, но, похоже, ничегоразрабатывать.Я отчаянно нуждаюсь в решениях.Спасибо!