애플리케이션을 개발 중이며 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; }
}
처럼
을 반환 호출? http://stackoverflow.com/questions/19467673/entity-framework-self-referencing-loop-detected – hardkoded
예,이 시도했지만 작동하지 않았다. –
EF Chat 클래스 대신 동적 클래스를 사용하는 것은 어떻습니까? – hardkoded