首页 > 解决方案 > 从服务器外部访问网站时,ASP.Net PageLoad 和控制事件触发两次

问题描述

这是一个让我发疯了几个月的问题。看起来很复杂,所以我做了一个很简单的例子来演示一下。

我有一个使用 ASP .Net 并使用 IIS 和 SQL Server 数据库托管在微软服务器上的网站。在本地服务器上调试或从服务器内部访问时,该网站工作正常。

但是,每当我从客户端使用该网站时(= 当它部署在我的远程服务器上时从我的计算机访问它),该网站的页面似乎每次都加载两次。意义 :

所以,我做了一个小网页,托管在同一个网站上,但与它的任何其他页面都不相关(也不使用 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 方法连续触发了两次,就好像每次调用服务器时都加载了两次网页一样。

鉴于代码的简单性,我真的认为这与网站配置或服务器环境有关,但我并不是这方面的专家。

我在互联网上搜索了多次解决方案,花了几个小时尝试与纯编程相关的东西,但似乎没有任何效果。我迫切需要解决方案。谢谢 !

标签: c#asp.netiis

解决方案


推荐阅读