C# WebSocket实现

C# WebSocket实现,c#,asp.net,api,websocket,C#,Asp.net,Api,Websocket,我想创建一个WebSocket示例,其中我不想刷新页面以获取最新数据 我创建了一个Html页面,其中创建了websocket的一个对象 例如 客户端实现 服务器端实现 我使用WebSocket的方式正确吗 请帮我清理一下这一部分。这是一个示例 首先,您必须安装Asp.net signal软件包及其依赖项。 应用程序启动时,您已呼叫信号器 namespace ABC { public partial class Startup { public void Confi

我想创建一个WebSocket示例,其中我不想刷新页面以获取最新数据

我创建了一个Html页面,其中创建了websocket的一个对象

例如

客户端实现 服务器端实现 我使用WebSocket的方式正确吗

请帮我清理一下这一部分。

这是一个示例
首先,您必须安装
Asp.net signal
软件包及其依赖项。
应用程序启动时,您已呼叫信号器

namespace ABC
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
            app.MapSignalR(); <--{Add this line}
        }        
    }
}
您必须创建自定义
Hubclass
扩展
Hub基类

public class MessagesHub : Hub
{
    [HubMethodName("sendMessages")]
    public void SendMessages()
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MessagesHub>();
        context.Clients.All.updateMessages();
    }
}
数据库表中有任何更改时,服务器使用
sqlDependency

getAllMessages()
是代码要处理的控制器,应该显示在查看页面中,当应用程序启动以及数据库中的任何更改时,它将被调用

public ActionResult GetNotificationMessages()
        {
            NotificationRepository notification = new NotificationRepository();
            return PartialView("_NotificationMessage");
        }
模型中

public class NotificationRepository
    {
        readonly string connectionString = ConfigurationManager.ConnectionStrings["InexDbContext"].ConnectionString;

        public IEnumerable<Notification> GetAllMessages(string userId)
        {
            var messages = new List<Notification>();
            using(var connection = new SqlConnection(connectionString))
            {

                connection.Open();
                using (var command = new SqlCommand(@"SELECT [NotificationID], [Message], [NotificationDate], [Active], [Url], [userId] FROM [dbo].[Notifications] WHERE [Active] = 1 AND [userId] ='" + userId + "'", connection))
                {
                    command.Notification = null;

                    var dependency = new SqlDependency(command);
                    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
                    if (connection.State == ConnectionState.Closed)
                    {
                        connection.Open();
                    }
                    var reader = command.ExecuteReader();
                    while (reader.Read())
                    {
                        messages.Add(item: new Notification { NotificationID = (int)reader["NotificationID"], Message = (string)reader["Message"], Url = (string)reader["Url"] });
                    }
                }
            }
            return messages;
        }

        private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
        {
            if (e.Type == SqlNotificationType.Change)
            {
                MessagesHub message = new MessagesHub();
                message.SendMessages();
            }
        }
    }
公共类通知存储库
{
只读字符串connectionString=ConfigurationManager.connectionString[“inXdbContext”]。connectionString;
公共IEnumerable GetAllMessages(字符串用户ID)
{
var messages=新列表();
使用(var连接=新的SqlConnection(connectionString))
{
connection.Open();
使用(var command=new SqlCommand(@“从[dbo].[NotificationID]、[Message]、[NotificationDate]、[Active]、[Url]、[userId]中选择[NotificationID]。[Notifications],其中[Active]=1和[userId]=“+userId+”,连接))
{
command.Notification=null;
var-dependency=newsqldependency(命令);
dependency.OnChange+=新的OnChangeEventHandler(dependency\u OnChange);
if(connection.State==ConnectionState.Closed)
{
connection.Open();
}
var reader=command.ExecuteReader();
while(reader.Read())
{
添加(项目:新通知{NotificationID=(int)读卡器[“NotificationID”]、消息=(字符串)读卡器[“Message”]、Url=(字符串)读卡器[“Url”});
}
}
}
返回消息;
}
private void dependency_OnChange(对象发送方,SqlNotificationEventArgs e)
{
if(e.Type==SqlNotificationType.Change)
{
MessagesHub message=newmessageshub();
message.SendMessages();
}
}
}
数据库表
更新时,这很好地显示了最新的数据。消息将在运行时显示。

希望这对你有所帮助

你走上了正确的道路

如果我没有迟到,你可以参考这个……这是一个有效的例子

客户端

在服务器端添加以下类

public class MicrosoftWebSockets : WebSocketHandler
{
    private static WebSocketCollection clients = new WebSocketCollection();
    private string msg;

    public override void OnOpen()
    {
        this.msg = this.WebSocketContext.QueryString["username"];
        clients.Add(this);
        clients.Broadcast(msg);
    }

    public override void OnMessage(string message)
    {
        clients.Broadcast(string.Format(message));
    }

    public override void OnClose()
    {
        clients.Remove(this);
        clients.Broadcast(string.Format(msg));
    }
将此dll添加到上述类 使用Microsoft.Web.WebSockets


我不记得我是从哪里得到参考的……但是上面的代码是从我当前的工作应用程序中派生出来的

是否出现了错误这种web套接字实现方式是正确的?你的确切要求是什么?安南,我只想澄清一下我的WebSocket功能实现是否正确,是否可以在不刷新的情况下获取最新数据。我不知道如何澄清他的问题,所以我放了一个简单的程序让他理解你完整地复制了一些教程,没有回答OP的问题。你知道他的实现是半生不熟的
   $(function () {
        // Declare a proxy to reference the hub.
        var notifications = $.connection.messagesHub;
        //debugger;
        // Create a function that the hub can call to broadcast messages.
        notifications.client.updateMessages = function () {
            getAllMessages()
        };
        // Start the connection.
        $.connection.hub.start().done(function () {
            getAllMessages();
        }).fail(function (e) {
            alert(e);
        });
    });
    function getAllMessages() {
            $.ajax({
               url: '../../Notifications/GetNotificationMessages',
               .
               .
       }
public ActionResult GetNotificationMessages()
        {
            NotificationRepository notification = new NotificationRepository();
            return PartialView("_NotificationMessage");
        }
public class NotificationRepository
    {
        readonly string connectionString = ConfigurationManager.ConnectionStrings["InexDbContext"].ConnectionString;

        public IEnumerable<Notification> GetAllMessages(string userId)
        {
            var messages = new List<Notification>();
            using(var connection = new SqlConnection(connectionString))
            {

                connection.Open();
                using (var command = new SqlCommand(@"SELECT [NotificationID], [Message], [NotificationDate], [Active], [Url], [userId] FROM [dbo].[Notifications] WHERE [Active] = 1 AND [userId] ='" + userId + "'", connection))
                {
                    command.Notification = null;

                    var dependency = new SqlDependency(command);
                    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
                    if (connection.State == ConnectionState.Closed)
                    {
                        connection.Open();
                    }
                    var reader = command.ExecuteReader();
                    while (reader.Read())
                    {
                        messages.Add(item: new Notification { NotificationID = (int)reader["NotificationID"], Message = (string)reader["Message"], Url = (string)reader["Url"] });
                    }
                }
            }
            return messages;
        }

        private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
        {
            if (e.Type == SqlNotificationType.Change)
            {
                MessagesHub message = new MessagesHub();
                message.SendMessages();
            }
        }
    }
    var ws;
    var username = "JOHN";
    function startchat() {

        var log= $('log');
        var url = 'ws://<server path>/WebSocketsServer.ashx?username=' + username;

        ws = new WebSocket(url);

        ws.onerror = function (e) {
            log.appendChild(createSpan('Problem with connection: ' + e.message));
        };

        ws.onopen = function () {
            ws.send("I am Active-" +username);
        };

        ws.onmessage = function (e) {


            if (e.data.toString() == "Active?") {
                ws.send("I am Active-" + username);
            }
            else {

            }

        };

        ws.onclose = function () {
            log.innerHTML = 'Closed connection!';
        };

    }
</script>
<div id="log">

</div>
    public void ProcessRequest(HttpContext context)
    {
        if (context.IsWebSocketRequest)
        {
            context.AcceptWebSocketRequest(new MicrosoftWebSockets());
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}
public class MicrosoftWebSockets : WebSocketHandler
{
    private static WebSocketCollection clients = new WebSocketCollection();
    private string msg;

    public override void OnOpen()
    {
        this.msg = this.WebSocketContext.QueryString["username"];
        clients.Add(this);
        clients.Broadcast(msg);
    }

    public override void OnMessage(string message)
    {
        clients.Broadcast(string.Format(message));
    }

    public override void OnClose()
    {
        clients.Remove(this);
        clients.Broadcast(string.Format(msg));
    }