Signalr Owin简单示例javascript客户端未被调用 [英] Signalr Owin simple example javascript client not being called
问题描述
我有一个5.3.0版本的Signalr自托管,该版本正在升级到一个较新的Signalr版本. 使用 https://github.com/SignalR/SignalR/wiki/Self-host示例我创建了一个简单的示例,但是我无法使其正常工作.
I have a 5.3.0 version of signalr self hosting that is being upgraded to a newer version of signalr. Using https://github.com/SignalR/SignalR/wiki/Self-host example i have created a simple example, but i can’t get it to work.
我可以连接到服务器上的集线器并在集线器上调用方法,但是我无法使集线器调用javascript客户端.
I can get a connection to the hub on the server and call methods on the hub, but i can’t get the hub to call the javascript client.
在提琴手中看着它时,我再也没有看到来自集线器的响应.
When looking at it in fiddler I never see a response come back from the hub.
这是代码
using System;
using Microsoft.AspNet.SignalR;
using Microsoft.Owin.Hosting;
using Owin;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
string url = "http://localhost:8080/";
using (WebApplication.Start<Startup>(url))
{
Console.WriteLine("Server running on {0}", url);
Console.ReadLine();
}
}
}
}
using Microsoft.AspNet.SignalR;
using Owin;
namespace ConsoleApplication3
{
class Startup
{
// This method name is important
public void Configuration(IAppBuilder app)
{
var config = new HubConfiguration
{
EnableCrossDomain = true,
EnableJavaScriptProxies = true
};
app.MapHubs(config);
}
}
}
using System;
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;
using Newtonsoft.Json;
namespace ConsoleApplication3.Hubs
{
public class Chat : Hub
{
public override Task OnConnected()
{
Notify(Context.ConnectionId);
return new Task(() => { });
}
public void RunTest()
{
Notify(Context.ConnectionId);
}
public void Notify(string connectionId)
{
dynamic testMessage = new
{
Count = 3,
Message = "Some test message",
Timestamp = DateTime.Now
};
String json = JsonConvert.SerializeObject(testMessage);
var context = GlobalHost.ConnectionManager.GetHubContext<Chat>();
context.Clients.Client(connectionId).sendNotification(json);
}
}
}
这是客户端
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script src="Scripts/json2.js"></script>
<script src="Scripts/jquery-1.9.1.js"></script>
<script src="Scripts/jquery.signalR-1.0.1.js"></script>
<script src="http://localhost:8080/signalr/hubs"></script>
<script>
$(function () {
// Proxy created on the fly
var notification = $.connection.chat;
$.connection.hub.logging = true;
// Declare functions that can be run on the client by the server
notification.client.sendNotification = onAddNotification;
notification.client.disconnected = function (connectionid) {
console.log(connectionid);
};
// Testing code only
$("#testButton").click(function () {
// Run test function on server
notification.server.runTest();
});
jQuery.support.cors = true;
// Map the onConnect and onDisconnect functions
notification.client.connected = function () {
alert("Notification system connected");
};
notification.client.disconnected = function () { };
$.connection.hub.url = "http://localhost:8080/signalr";
//$.connection.hub.start();
$.connection.hub.start(function () {
alert("Notification system connected");
});
});
// Process a newly received notification from the server
function onAddNotification(message) {
// Convert the passed json message back into an object
var obj = JSON.parse(message);
var parsedDate = new Date(parseInt(obj.Timestamp.substr(6)));
// Update the notification list
$('#notifications').prepend('<li>' + obj.Message + ' at ' + parsedDate + '</li>');
};
</script>
</head>
<body>
<a href="javascript:void(0)" class="btn" id="testButton">Send test</a>
<ul class="unstyled" id="notifications">
</ul>
</body>
任何想法都将不胜感激,因为我很受困.
Any ideas would be appreciated, since i am fairly stuck.
推荐答案
代码中的几件事:
更改此:
public override Task OnConnected()
{
Notify(Context.ConnectionId);
return new Task(() => { });
}
收件人:
public override Task OnConnected()
{
Notify(Context.ConnectionId);
return base.OnConnected();
}
也在您的中心:
此功能正在尝试:
public void Notify(string connectionId)
{
dynamic testMessage = new
{
Count = 3,
Message = "Some test message",
Timestamp = DateTime.Now
};
String json = JsonConvert.SerializeObject(testMessage);
var context = GlobalHost.ConnectionManager.GetHubContext<Chat>();
context.Clients.Client(connectionId).sendNotification(json);
}
我什至不确定为什么要传递连接ID(也许是静态的?)
I'm not even sure why you're passing the connection id (maybe it was meant to be static?)
public void Notify()
{
dynamic testMessage = new
{
Count = 3,
Message = "Some test message",
Timestamp = DateTime.Now
};
Clients.Client(Context.ConnectionId).sendNotification(testMessage);
}
您不需要序列化两次,我们已经为您完成了.
You don't need to serialize twice, we already do it for you.
删除:
jQuery.support.cors = true;
永远不要设置它.
也:
// Map the onConnect and onDisconnect functions
notification.client.connected = function () {
alert("Notification system connected");
};
notification.client.disconnected = function () { };
这些没有映射任何客户端.您无法将已连接和已断开连接的服务器映射到客户端.客户有自己的事件.
These aren't mapping anything client side. You can't map connected and disconnected from the server to the client. The client has its own events.
其他事项:
这应该在启动回调中,这样您就可以在未准备好之前就不打它:
This should be inside of the start callback so that you don't hit it before it's ready:
$.connection.hub.start().done(function() {
// Testing code only
$("#testButton").click(function () {
// Run test function on server
notification.server.runTest();
});
});
这篇关于Signalr Owin简单示例javascript客户端未被调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!