2017-05-06 2 views
1

애플리케이션을 개발 중이며 MVC5와 함께 SignalR을 사용하여 실시간 채팅을 작성했습니다. 나는 First Code EF를 사용하고있다. 이 채팅은 데이터베이스 (채팅 테이블)에 채팅을 보내기, 받기 및 저장하는 기능을 사용하면 잘 작동하지만 db에서 채팅을 검색하기 위해 onconnect 메서드를 추가하면 보내기와 검색 중 하나를 멈추게됩니다. 내가 onconnect 메서드를 주석 처리 할 때마다 다른 메서드도 제대로 작동합니다. (onconnect 메서드가 작동했지만 갑자기 작동하지 않음). 많은 솔루션을 검색해 보았지만 일주일 동안 계속 노력했지만 여전히이 문제가 발생했습니다. 이 문제를 디버깅 할 때signalr 허브를 사용하는 실시간 채팅에서 오류가 발생합니다.

오류는 다음과 같습니다 좀 더 자세한 내용이 오류를 클릭하면

XML Parsing Error: no root element found Location: http://localhost:49430/signalr/abort?transport=serverSentEvents&clientProtocol=1.5&

는이 제공 :

:

Self referencing loop detected for property 'AspNetUsers' with type 'System.Data.Entity.DynamicProxies.ApplicationUser_23AA294498688966C3E26561B78E32FEA355D79546483C6C3DD66A96A9AF5D33'. Path 'A[1][0].Posts[0]

나는 문제가 여기에있다 생각

return Clients.Caller.connected(userName, allUsers, messages); 

로 변경했습니다.
return Clients.All.connected(userName, allUsers, messages); 

그러나 여전히 작동하지 않는 경우 어떤 도움을 주시면 감사하겠습니다.

이 내 허브 클래스입니다 : 내가 이름을 채팅과 일반 ActionResult 방법을 사용하고 내 HomeController에서

namespace myWall 
{ 
    public class ChatHub : Hub 
    { 
     public override System.Threading.Tasks.Task OnConnected() 
     { 
      ApplicationDbContext db = new ApplicationDbContext(); 
      string userName = Context.User.Identity.Name; 

      var allUsers = db.Users.ToList(); 
      var messages = db.Chats.ToList(); 

      return Clients.Caller.connected(userName, allUsers, messages); 
     } 

     public void SendMessageToAll(string UserName, string message) 
     { 
      ApplicationDbContext dc = new ApplicationDbContext(); 
      UserName = Context.User.Identity.Name; 

      AddAllMessageinCache(UserName, message); 

      // Broad cast message 
      Clients.All.NewMessage(UserName, message); 
     } 

     private void AddAllMessageinCache(string UserName, string message) 
     {  
      var userId = Context.User.Identity.GetUserId(); 
      using (ApplicationDbContext dc = new ApplicationDbContext()) 
      { 
       var messageDetail = new Chat 
       { 
        UserId = userId, 
        userName = UserName, 
        Message = message 
       }; 
       dc.Chats.Add(messageDetail); 
       dc.SaveChanges(); 
      } 
     } 
    } 

, 나는 허브 클래스에 connect이 방법에 뷰를 추가했다. 이 내 채팅도이다 (이것은 HTML 양식을 포함뿐만 아니라 스크립트 코드 때문에 그냥 일반 양식)

@section scripts { 

    <script src="~/Scripts/jquery.signalR-2.2.1.js"></script> 
    <script src="~/signalr/Hubs"></script> 

    <script> 
       $(function() { 

        var chat = $.connection.chatHub; 



        chat.client.connected = function (userName, allUsers, messages) { 
         for (i = 0; i < allUsers.length; i++) { 
          $("#results").append(allUsers[i].UserName + "</br>"); 

         } 

         for (i = 0; i < 20; i++) { 
          $("#oldmsg").append(messages[i].userName + ": " + messages[i].Message + "</br>"); 
         } 
         $("#oldmsg").append("<font color= 'red' >" + "Welcome " + "<strong>" + userName + "</strong>" + " to the most fantastic real time chat" + "</font>" + "</br>"); 
         $('#chat').scrollTop($('#chat')[0].scrollHeight); 
        }; 



        chat.client.NewMessage = function (userName, msg) { 
         $('#Chats').append('<li><strong>' + htmlEncode(userName) 
          + '</strong>: ' + htmlEncode(msg) + '</li>'); 
        }; 

        registerClientMethods(chat) 

        $.connection.hub.start().done(function() { 
         registerEvents(chat) 
        }); 
       }); 




       function registerEvents(chat) { 




        $('#BtnSend').click(function() { 
         chat.server.sendMessageToAll($('#UserName').val(), $('#TxtMessage').val()); 
         $('#TxtMessage').val('').focus(); 
        }); 
       } 

       function htmlEncode(value) { 
        var encodedValue = $('<div />').text(value).html(); 
        return encodedValue; 
       } 


    </script> 

이 내 채팅 테이블 :

[Table("Chat")] 
public partial class Chat 
{ 
    public int Id { get; set; } 

    [StringLength(128)] 
    public string UserId { get; set; } 

    public int? WallId { get; set; } 

    public DateTime? Time { get; set; } 

    [Required] 
    [StringLength(500)] 
    public string Message { get; set; } 

    [MaxLength(1)] 
    public byte[] File { get; set; } 

    public int? Code { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string userName { get; set; } 

    [StringLength(256)] 
    public string ConnectionId { get; set; } 
} 
+0

처럼

을 반환 호출? http://stackoverflow.com/questions/19467673/entity-framework-self-referencing-loop-detected – hardkoded

+0

예,이 시도했지만 작동하지 않았다. –

+0

EF Chat 클래스 대신 동적 클래스를 사용하는 것은 어떻습니까? – hardkoded

답변

1

귀하의 재정의 기반을 반환해야 . 연결되지 않았습니다. 그래서 Client.Caller.connected는 base.OnConnected 당신이 체크 아웃 한 적이이

public override System.Threading.Tasks.Task OnConnected() 
    { 
     ApplicationDbContext db = new ApplicationDbContext(); 
     string userName = Context.User.Identity.Name; 

     var allUsers = db.Users.ToList(); 
     var messages = db.Chats.ToList(); 

     Clients.Caller.connected(userName, allUsers, messages); 
     return base.OnConnected(); 
    } 
관련 문제