2011-08-02 80 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

相關問題