【问题标题】:Null object cannot be converted to a value type exception is thrown inside ProcessRequest MethodNull 对象无法转换为值类型 在 ProcessRequest 方法中抛出异常
【发布时间】:2015-03-10 08:48:19
【问题描述】:

我能够获得 CurrentSideId,我可以通过应用程序在任何地方说。我有一个名为 MainClass 的类。它具有静态 CurrentSideId 属性。 MainClass.CurrentSiteId 返回请求的 SiteId

public class MainClass{
   public static int CurrentSiteId
   {
      get { return HttpContext.Current.Request.RequestContext.RouteData.Values["CurrentSiteId"].To<int>(); }
      set {..}
   }
}

但是,当涉及到HttpHandlerProcessRequest 方法时,CurrentSiteId 会抛出System.InvalidCastException 类型的异常:Null object cannot be converted to a value type.

public class MyRouteHandler : MvcRouteHandler
{
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return new MyHttpHandler();
    }
}
public class MyHttpHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        var siteId = MainClass.CurrentSiteId;
    }
}

解决办法是什么?

【问题讨论】:

  • 错误信息有什么不清楚的地方? Values 返回 null,因为密钥不存在,因此它返回 null,您尝试将其转换为 int
  • 那么我怎样才能在 HttpHandler 中获取 siteid 呢?

标签: c# asp.net asp.net-mvc httphandler httpcontext


【解决方案1】:

如果传入路由值,您应该可以通过context 访问它:

Convert.ToInt16(context.Request.RequestContext.RouteData.Values["CurrentSiteId"]);

更新

尝试以下方法:

public class MyHttpHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        var siteId = Convert.ToInt16(context.Request.RequestContext.RouteData.Values["CurrentSiteId"]);
    }
}

【讨论】:

  • 我已经试过了。 Values["CurrentSiteId"] 没有 To 扩展名。
  • @Jude 我认为您必须包含扩展方法的命名空间。如果您转到To&lt;int&gt; 方法的定义,您将看到或使用上述方法。我改为使用Convert.ToInt16
  • 这只给了我控制器名称和动作名称。似乎没有“CurrentSiteId”键。
  • @Jude 调用应用程序一定不能传递它,调用它的是什么?
  • 编辑了问题。添加了路由处理程序。这能回答你的问题吗?
【解决方案2】:

你应该在强制转换之前检查该值是否不为空 可以在这里找到一个很好的示例:In MVC3, how to get the current action name? (将 action 替换为您要调用的方法)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    相关资源
    最近更新 更多