c# - 从服务器外部访问网站时,ASP.Net PageLoad 和控制事件触发两次
问题描述
这是一个让我发疯了几个月的问题。看起来很复杂,所以我做了一个很简单的例子来演示一下。
我有一个使用 ASP .Net 并使用 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 方法连续触发了两次,就好像每次调用服务器时都加载了两次网页一样。
鉴于代码的简单性,我真的认为这与网站配置或服务器环境有关,但我并不是这方面的专家。
我在互联网上搜索了多次解决方案,花了几个小时尝试与纯编程相关的东西,但似乎没有任何效果。我迫切需要解决方案。谢谢 !
解决方案
推荐阅读
- c++ - 将 exr/pfm 保存为小端
- java - 无法从 DOMSource 创建 XMLStreamReader 或 XMLEventReader
- php - 为什么 $results = DB::select 有效,而 DB::table 无效?
- azure-devops - Azure Devops 扩展操作
- node.js - 在 Swagger openapi v3.0.0 中,面临多个文件上传的问题
- php - PHP MYSQL 在阿拉伯语中插入数据散列
- optimization - 在 Pytorch 中执行优化时如何对变量应用边界?
- python - 通过 simple-salesforce Python 访问 Salesforce 联系人记录的 ActivityMetric 字段
- swift - 如果是“是”,如何隐藏标签和文本字段,但也用下面的标签填充空白?
- javascript - 了解 indexOf 和 lastIndexOf