【问题标题】:Object reference null- URL rewriting asp.net对象引用 null- URL 重写 asp.net
【发布时间】:2011-07-27 00:10:14
【问题描述】:

我在其他运行良好的系统中使用 .NET 2.0 开发了我的 asp.net 网站。现在,当我在我的系统中复制 asp.net 网站并运行它时,我得到了运行时错误:

对象引用未设置为 对象的实例。

 public class FixURLs : IHttpModule 
{
    public FixURLs()
    {

    }

    #region IHttpModule Members

    public void Dispose()
    {
        // do nothing
    }

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

    }

 ..... some other logic

我在该行遇到对象引用错误:

context.CompleteRequest();

我的 web.Config 文件有

<compilation debug="true">
  <assemblies>
    <add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
  </assemblies>
</compilation>

我该如何解决这个问题?

编辑 编辑注释添加了新代码

 void context_BeginRequest(object sender, EventArgs e)
{


    HttpApplication app = (HttpApplication)sender;

    if (app.Request.RawUrl.ToLower().Contains("/bikes/default.aspx"))
    {
        app.Context.RewritePath("BikeInfo.aspx", "", "");
    }
    else if (app.Request.RawUrl.ToLower().Contains("/bikes/mountainbike.aspx"))
    {
        app.Context.RewritePath("BikeInfo.aspx", "", "ItemID=1");
    }
 }

【问题讨论】:

  • 任何帮助将不胜感激
  • 您是在本地 IIS 或 Cassini 开发 Web 服务器上运行它吗?
  • 我需要查看context_BeginRequest方法中的代码。可以发一下代码吗?
  • @Elad Lachmi 我在一台机器上使用 Visual Studio 2005 运行此应用程序,它运行良好,但是当我将代码复制粘贴到另一台机器并在 Visual Studio 2010 中运行时,我得到了这个错误。
  • @Chris - 我的猜测是 VS2010 中的 Cassini 版本正在向您的代码显示正确的行为。 CompleteRequest 停止对请求的所有处理。委托处理程序然后将请求丢弃在其上是没有意义的。将控制权传递给处理程序与调用方法不同。这不像处理程序被调用,然后控制权回到调用方法。您需要在 context_BeginRequest 方法中完成请求。

标签: asp.net url-rewriting object-reference


【解决方案1】:

void context_BeginRequest(object sender, EventArgs e) {

HttpApplication app = (HttpApplication)sender;

if (app.Request.RawUrl.ToLower().Contains("/bikes/default.aspx"))
{
    app.Context.RewritePath("BikeInfo.aspx", "", "");
    app.CompleteRequest(); 
}
else if (app.Request.RawUrl.ToLower().Contains("/bikes/mountainbike.aspx"))
{
    app.Context.RewritePath("BikeInfo.aspx", "", "ItemID=1");
    app.CompleteRequest(); 
}
}

【讨论】:

    【解决方案2】:

    我认为你应该把你的电话留给context.CompleteRequest();

    这通常是为了停止请求的执行,但是当您的应用程序正在初始化并且没有请求正在处理时,您会调用它。我的猜测是,在 .NET 2.0 中它会容忍这个调用并且不会做任何坏事,但在以后的版本中它会崩溃。

    在我看来,您并不想在重写 URL 后立即停止请求……否则,为什么还要重写它们?因此,请尝试摆脱该方法调用。

    【讨论】:

      【解决方案3】:

      我强烈怀疑您可能希望将 completerequest 放在 context_beginrequest 方法的末尾,因为现在这真的没有意义。如果不是这种情况,请同时发布该方法,以便清楚您要做什么。

      编辑:看起来您的意图是这样做:

       void context_BeginRequest(object sender, EventArgs e)
      {
      
          HttpApplication app = (HttpApplication)sender;
      
          if (app.Request.RawUrl.ToLower().Contains("/bikes/default.aspx"))
          {
              app.Context.RewritePath("BikeInfo.aspx", "", "");
              app.CompleteRequest(); 
          }
          else if (app.Request.RawUrl.ToLower().Contains("/bikes/mountainbike.aspx"))
          {
              app.Context.RewritePath("BikeInfo.aspx", "", "ItemID=1");
              app.CompleteRequest(); 
          }
       }
      

      您似乎不想调用 CompleteRequest,除非您实际上是在 BeginRequest 中做某事。需要明确的是,在您的原始代码中,您在 BeginRequest 事件触发之前调用 CompleteRequest。

      【讨论】:

      • 这是我和我的 cmets 一起去的地方 :)
      猜你喜欢
      • 2011-09-18
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      相关资源
      最近更新 更多