2011-08-02 76 views
1

基本上我一直从我的asp.net MVC应用越来越被抛出,因为该User.Identity.IsAuthenticated是假的,这只是发生的,因为下面相关任务注释代码(标记为**) - 我无法弄清楚它为什么会发生,任何帮助表示赞赏。下面我基地控制器上的自定义属性里面User.Identity.Name成为空,但我不明白为什么

代码,对用户进行认证,如果没有通过认证我抛出一个异常,像这样:导致该User.Identity.IsAuthenticated + User.Identity

if (!httpContext.User.Identity.IsAuthenticated) 
    throw new NoAccessException("unauthorized user"); // invalid users are thrown out... 

代码。名称成为空是:

[HttpGet] 
    public ActionResult TaskDetail(int houseid, int taskid) 
    { 

     //NOTE: _repo is a simple ISession over Linq to Sql 
     //GetCurrentUser() is a extention method which gets the current logged on user 
     //i.e. User.Identity.Name so I can get the users credentials 

     var loggedonuser = _repo.GetCurrentUser(); 

     var _house= _repo.Single<House>(x => x.HouseID== houseid&& x.ClientID== loggedonuser.CompanyID); 

     if (_house== null) 
      throw new NoAccessException(); 

     var summary = _instruction.ToSummaryDTO(); 

     var companies = _repo.All<Company>(); 
     //var users = _repo.All<User>(); 

     var task = _repo.Single<Task> 
      (x => x.HouseID== _house.HouseID && x.CompanyID == loggedonuser.CompanyID); 

     var dto = new TaskDTO 
     { 
      TaskID = task.TaskID, 
      Title = task.Title, 
      Description = task.Description, 
      DateCreated = task.DateCreated, 
      IsClosed = task.IsClosed, 
      CompanyID = companies.Where(y => task.CompanyID == y.CompanyID).SingleOrDefault().Identifier 
     }; 

     **dto.AllComments** = _repo.All<TaskComment>() 
      .Where(x => x.TaskID == task.TaskID) 
      .OrderByDescending(x => x.Timestamp) 
      .Select(x => new TaskCommentDTO 
      { 
       Comment = x.Comment, 
       Timestamp = x.Timestamp, 
       CompanyID = companies.Where(y => x.CompanyID == y.CompanyID).SingleOrDefault().Identifier 
      }); 


     return View(new TaskViewModel 
     { 
      Summary = summary, 
      TaskDetail = dto, 
     }); 
    } 

注:如果我省略了dto.AllComments(IQueryable的),那么一切工作正常,我永远不会抛弃我的系统或者更重要的是User.Identitiy仍然correc牛逼....我试图转换成列表 - 这是我理想但这并不正常工作或想,也许有什么毛病我的LINQ方法...

我的DTO:

public class TaskDTO 
{ 
    public int TaskID { get; set; } 
    public bool IsClosed { get; set; } 
    public string CompanyID { get; set; } 
    public string AssignedTo { get; set; } 
    public DateTime DateCreated { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public IQueryable<TaskCommentDTO> AllComments { get; set; } 
} 


public class TaskCommentDTO 
{ 
    public string CompanyID { get; set; } 
    public string UserID { get; set; } 
    public DateTime Timestamp { get; set; } 
    public string Comment { get; set; } 
} 

编辑:

protected override void Execute(System.Web.Routing.RequestContext requestContext) 
    { 
     base.Execute(requestContext); 
    } 
:其中被抛出的异常

我现在已经追查例外,我在基地控制器,它帮助我发现的bug overrided下面的代码页面加载完成0

后,该代码又跑了一次,当我检查了请求上下文中的值的RouteData我发现“错误”和“FileNotFound”,在这一点上,用户被归零了太多,现在我需要找出哪些文件没有找到...... :(

+0

您是否尝试调试以查看究竟哪一行引发异常?尝试逐步浏览并观察变量,看看会发生什么。 –

+0

是 - 只要我的过滤器运行时,NoAccessException抛出如上图所示,在此之前,我找不到,因为我不知道,如果什么代码是任何过滤我前运行......除了我说过,如果我删除相关的代码评论一切正常...... – Haroon

+0

linq查询看起来对你好吗? – Haroon

回答

0

从代码:

var task = _repo.Single<Task> 
      (x => x.HouseID == _house.HouseID && x.CompanyID == loggedonuser.CompanyID); 

    var dto = new TaskDTO 
    { 
     TaskID = task.TaskID, 
     Title = task.Title, 
     Description = task.Description, 
     DateCreated = task.DateCreated, 
     IsClosed = task.IsClosed, 
     CompanyID = companies.Where(y => task.CompanyID == y.CompanyID).SingleOrDefault().Identifier 
    }; 

这条线:

CompanyID = companies.Where(y => task.CompanyID == y.CompanyID).SingleOrDefault().Identifier 

SingleOrDefault()结果可能b调用属性Identifier e null。你有没有检查过,这是确定的。是在这条线上抛出异常吗?

请注意,您可以使用IEnumerable代替IQueryable;可能不会有什么区别,但如果这是崩溃的部分,你可以尝试一无所获。

+0

我删除调用公司和什么也没做......我真的感到很奇怪的是1号请求到这个URL一切正常,任何其他请求失败......莫不是与LINQ to SQL的映射的问题吗?或者是其他东西? – Haroon

+0

您可以通过在函数的开始处添加断点来确认哪条线引发异常。你可以用F11来进入该行的函数调用吗? –

+0

@克里斯 - 看到更新的问题,设法找到问题发生的地方(我认为)... – Haroon

相关问题