2017-10-24 12 views
0
 using (ConnectionMultiplexer connection = ConnectionMultiplexer.Connect("redisIP:6379,allowAdmin=true")) 
     { 

      Model.SessionInstances = connection.GetEndPoints() 
       .Select(endpoint => 
       {      
        var status = new Status(); 
        var server = connection.GetServer(endpoint); // Exception thrown here! 
        status.IsOnline = server.IsConnected; 
        return status; 
       }); 
     } 

위 코드는 ASP.NET ASPX 페이지의 코드 숨김에서 실행됩니다. 나는 아주 잘 작동하는 커맨드 라인 프로그램에서 실행되는 비슷한 코드를 가지고 있는데, 내가 여기서 잘못하고있는 것이 확실하지 않다. 유일한 차이점은 코드가 람다 대신에 foreach 루프를 사용한다는 것입니다. StackExchange.ConnectionMultiplexer.GetServer가 작동하지 않습니다.

이 코드를 실행할 때마다

, 나는 내가 매우 동일한 연결에서 엔드 포인트를 얻고으로이 이상한 것을 발견 예외 The specified endpoint is not defined

를 얻을. 리턴되는 엔드 포인트가 올 Y 르다.

내가 뭘 잘못하고 있니?


나는 새 연결 모든 페이지로드를 개방하지 말아야하지만, 이것은 단지 나를 위해 자주 액세스 관리자 페이지입니다 실현 않는다; 그래서 나는 성능 오버 헤드에 대해 걱정하지 않는다. 또한 저장된 연결은 특정 공급자를 추상화하는 CacheClass 내부에 숨겨져 있습니다.

답변

2

람다 식에서 반환 된 열거 형이 지연 평가되고 있기 때문에이 오류가 발생합니다. 람다식이 실행될 때까지는 연결은 이미 using 문에 의해 닫혀 있습니다.

using 문 안에는 람다 식을 실행해야합니다. 끝에 .ToList()을 추가하여 다음을 추가합니다.

using (ConnectionMultiplexer connection = ConnectionMultiplexer.Connect("redisIP:6379,allowAdmin=true")) 
{ 
     Model.SessionInstances = connection.GetEndPoints() 
     .Select(endpoint => 
     { 
      var status = new Status(); 
      var server = connection.GetServer(endpoint); 
      status.IsOnline = server.IsConnected; 
      return status; 
     }).ToList(); 
}