从服务器外部访问网站时,ASP.Net PageLoad和控件事件触发两次

时间:2018-10-02 13:53:41

标签: c# asp.net iis

这是一个困扰我几个月的问题。这似乎非常复杂,所以我举了一个非常简单的例子来演示它。

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

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

  • 在第一次加载时,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方法连续触发两次,就像每次调用服务器时网页都加载两次一样。

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

我多次在Internet上搜索解决方案,花了数小时来尝试与纯编程有关的内容,但似乎没有任何解决方法。我渴望解决方案。谢谢!

0 个答案:

没有答案