2011-08-02 4 views
1

기본적으로 User.Identity.IsAuthenticated가 false이기 때문에 기본적으로 내 asp.net mvc 응용 프로그램에서 예외가 발생합니다.이 오류는 작업 주석과 관련된 아래의 코드로 인해 발생합니다 (아래 ** 표시) - 나는 그것이 일어나는 이유를 이해할 수 없으며, 어떤 도움을 주셔서 감사합니다. 나는 예외과 같이 던져 인증되지 않은 경우, 사용자를 인증 내 기본 컨트롤러의 사용자 지정 특성 내부 아래User.Identity.Name은 null이되지만 이유를 이해할 수 없음

코드 : User.Identity.IsAuthenticated + User.Identity를 일으키는

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

코드입니다. 널 (null)이 될 이름은 다음과 같습니다

[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 남아 t는 .... 나는 목록으로 변환하는 시도 - ..., 어쩌면 내 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); 
    } 
: 지금 예외를 추적 한

예외가 발생되고, 나는 나 버그를 발견하는 데 도움 내 기본 컨트롤러에 아래의 코드를 오버라이드 0

페이지 로딩이 끝나면 요청 문맥을 체크 아웃 할 때이 코드가 다시 실행되었습니다.이 시점에서 "오류"및 "FileNotFound"를 발견 한 RouteData의 값에서이 시점에서 사용자도 역시 나도 꺼내집니다. ... 발견되지 않는 파일을 찾을 필요가 :(

+0

디버깅을 시도하여 예외를 throw하는 줄을 정확히 확인 했습니까? 단계별로 시도해보고 변수를보고 어떤 일이 발생하는지 확인하십시오. –

+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() 결과에 재산 Identifier를 호출 e null. 이게 괜찮은지 확인해 봤어? 이 줄에서 예외가 발생 했습니까?

IQueryable 대신 IEnumerable을 사용할 수 있습니다. 아마 아무런 차이가 없겠지만 충돌 부분이라면 아무 것도 시도하지 않아도됩니다.

+0

나는 회사에 전화를 제거하고 아무것도 안 했어 ... 나는이 URL에 대한 첫 번째 요청에서 모든 것이 작동한다는 것을 알 수있다. 다른 요청은 실패한다. SQL 매핑에 대한 linq 문제가있을 수 있는가? 또는 다른 것? – Haroon

+0

함수의 시작 부분에 예외를 throw하는 중단 점을 추가하여 확인할 수 있습니까? F11을 사용하여 해당 회선의 기능 호출을 수행 할 수 있습니까? –

+0

@ Chris- 업데이트 된 질문을보고, 문제가 발생하고있는 곳을 찾을 수 있습니다. (제 생각에는 ... – Haroon

관련 문제