私はアプリケーションを開発しており、MVC5でSignalRを使用してリアルタイムチャットを作成しました。私はファーストコードEFを使用しています。このチャットはデータベース(チャットテーブル)へのチャットの送信、受信、保存を使用するとうまく動作しますが、onconnect
メソッドを追加してdbからチャットを取得すると、送信と検索の両方が停止します。私がonconnect
メソッドをコメントするたびに、他のメソッドは正常に動作します。 (onconnect
メソッドが動作していましたが、突然停止しました)。私は多くのソリューションをたくさん検索し、1週間試し続けましたが、まだこの問題を抱えていました。signalr hubを使用したリアルタイムチャットでエラーが発生する
この問題をデバッグするときにエラーがある:
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
に、このメソッドにビューを追加しました。 これは私のチャット図である:
@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>
と、この私のチャットテーブル(なぜなら、それは単なる形式これはHTMLフォームを含むだけでなく、スクリプトコードです):
[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; }
}
同様base.OnConnected
を返す呼び出すあなたがこれをチェックアウトしたことがありますか? http://stackoverflow.com/questions/19467673/entity-framework-self-referencing-loop-detected – hardkoded
はい、私はこれを試したが動作しませんでした。 –
EFチャットクラスの代わりにダイナミッククラスを使うのはどうですか? – hardkoded