Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 访问IHttpModule中的表单集合会导致事件处理程序在默认页面上未被调用_C#_Asp.net_Iis_Ihttpmodule - Fatal编程技术网

C# 访问IHttpModule中的表单集合会导致事件处理程序在默认页面上未被调用

C# 访问IHttpModule中的表单集合会导致事件处理程序在默认页面上未被调用,c#,asp.net,iis,ihttpmodule,C#,Asp.net,Iis,Ihttpmodule,好吧,这是个奇怪的问题。我创建了一个简单的示例站点来演示这个问题。在其中,我有一个Default.aspx页面,上面有一个按钮: <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> <p><asp:Button OnClick="ButtonClick" Text="Button" runat="server" /> </p>

好吧,这是个奇怪的问题。我创建了一个简单的示例站点来演示这个问题。在其中,我有一个Default.aspx页面,上面有一个按钮:

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <p><asp:Button OnClick="ButtonClick" Text="Button" runat="server" />
    </p>
    <asp:Label ID="output" runat="server" />
</asp:Content>
然后,我有一个IHttpModule,每个请求都会调用它:

public class SampleModule : IHttpModule
{
    public void Dispose()
    {
    }

    public void Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(context_BeginRequest);
    }

    private void context_BeginRequest(object sender, EventArgs e)
    {
        HttpApplication application = sender as HttpApplication;
        if(application == null)
        {
            return;
        }
        HttpContext context = application.Context;
        if(context == null)
        {
            return;
        }

        string text = "queryStringParam";

        var value = context.Request[text];
        var boolValue = value == null;
    }
}
同样,这只是一个演示,但这里的重点是,我正在访问请求,以从查询字符串中获取值。如果我在卡西尼号上运行这个,一切正常。然而,当我在IIS中运行这个时,就会发生这种情况。当我在以下位置运行站点时:

http://mysamplesite.dev/
然后点击按钮,什么也没发生。页面只是重新加载,但从未调用按钮的事件处理程序,随后标签文本也从未更新。但是,如果我在以下位置运行它:

http://mysamplesite.dev/Default.aspx
然后单击按钮,它工作正常,我的事件处理程序确实会被调用

在仔细研究了一些之后,我将模块中的代码更改为:

string text = "queryStringParam";

var value = context.Request.QueryString[text];
var boolValue = value == null;
string text = "queryStringParam";

var value = context.Request.QueryString[text];
var boolValue = value == null;

var value2 = context.Request.Form[text];
var boolValue2 = value2 == null;
注意,这里我直接访问QueryString属性,而不是context.Request。当我将其更改为此时,无论url中是否有Default.aspx,它都可以正常工作

我做的下一步是查看Reflector,看看HttpRequest indexer属性的代码实际上做了什么:

public string this[string key]
{
    get
    {
        string str = this.QueryString[key];
        if (str != null)
        {
            return str;
        }
        str = this.Form[key];
        if (str != null)
        {
            return str;
        }
        HttpCookie cookie = this.Cookies[key];
        if (cookie != null)
        {
            return cookie.Value;
        }
        str = this.ServerVariables[key];
        if (str != null)
        {
            return str;
        }
        return null;
    }
}
似乎无害,它只是为我检查各种收集,所以我不需要逐个检查。所以我想知道,这些电话中的哪一个打破了它。然后,我将模块更改为:

string text = "queryStringParam";

var value = context.Request.QueryString[text];
var boolValue = value == null;
string text = "queryStringParam";

var value = context.Request.QueryString[text];
var boolValue = value == null;

var value2 = context.Request.Form[text];
var boolValue2 = value2 == null;
现在又坏了!因此,长话短说,只要访问IHttpModule中请求的表单集合,我就以某种方式搞砸了回发,事件永远不会被触发

有人知道为什么会这样吗?我更像是一个ASP.NETMVC的人,我不太了解ASP.Net和它在幕后的所有技巧,以至于我真的有一个线索来解释为什么会发生这种情况

  • 给你的按钮一个ID(没有运气)
  • 试试fiddler,看看交通情况如何——这里发生了一些有趣的事情
  • 当向“”发出请求时http://mysamplesite.dev/Default.aspx“,
    context\u BeginRequest
    事件处理程序只调用一次,正如您所期望的那样。但是,当向“发出请求时”http://mysamplesite.dev/“,由于某种原因,
    context_BeginRequest
    被调用了两次

    为了“http://mysamplesite.dev/“,当执行
    context.Request[“queryStringParam”]
    时,第一次通过
    context\u BeginRequest
    正确加载
    表单
    值,但是第二次通过没有(我使用反射检查了
    context.Request
    上的私有
    表单
    值)。在此期间,页面的
    Page\u Load
    方法只调用一次

    因此,事件没有得到正确处理,因为ASP.NET处理“/”的请求与处理“/Default.aspx”的请求略有不同,它为模块触发了两次而不是一次
    BeginRequest
    。至于ASP.NET为什么会这样做,我不太清楚。您可能需要分析ASP.NET请求,并查看在
    HttpRequest
    上调用了哪些方法,以了解为什么表单值在第二次调用
    context\u BeginRequest
    时无法正确传递(另外,为什么在第一次调用时还会进行第二次调用)

    注意:这必须是内部ASP.NET内容(可能是服务器。从“/”传输到“/Default.aspx”或类似内容),因为Fiddler2只显示来自浏览器的一个请求http://mysamplesite.dev/“