{"id":384,"date":"2023-03-12T12:44:59","date_gmt":"2023-03-12T05:44:59","guid":{"rendered":"https:\/\/thietkewebdalat.net\/blog\/?p=384"},"modified":"2023-03-12T12:44:59","modified_gmt":"2023-03-12T05:44:59","slug":"signalr-trong-mvc","status":"publish","type":"post","link":"https:\/\/thietkewebdalat.net\/blog\/signalr-trong-mvc\/","title":{"rendered":"SignalR trong MVC"},"content":{"rendered":"<p>SignalR l\u00e0 m\u1ed9t th\u01b0 vi\u1ec7n cho ph\u00e9p truy\u1ec1n tin nh\u1eafn th\u1eddi gian th\u1ef1c gi\u1eefa m\u00e1y kh\u00e1ch v\u00e0 m\u00e1y ch\u1ee7. N\u00f3 cho ph\u00e9p c\u00e1c \u1ee9ng d\u1ee5ng web c\u1ee7a b\u1ea1n c\u00f3 th\u1ec3 g\u1eedi v\u00e0 nh\u1eadn c\u00e1c th\u00f4ng tin th\u1eddi gian th\u1ef1c m\u1ed9t c\u00e1ch nhanh ch\u00f3ng v\u00e0 hi\u1ec7u qu\u1ea3.<\/p>\n<p>Trong MVC, b\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng SignalR \u0111\u1ec3 cung c\u1ea5p c\u00e1c t\u00ednh n\u0103ng th\u1eddi gian th\u1ef1c trong \u1ee9ng d\u1ee5ng c\u1ee7a m\u00ecnh. C\u1ee5 th\u1ec3, b\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng SignalR \u0111\u1ec3 g\u1eedi th\u00f4ng b\u00e1o \u0111\u1ebfn kh\u00e1ch h\u00e0ng c\u1ee7a b\u1ea1n khi c\u00f3 th\u00f4ng tin m\u1edbi \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt tr\u00ean m\u00e1y ch\u1ee7.<\/p>\n<p>\u0110\u1ec3 s\u1eed d\u1ee5ng SignalR trong MVC, b\u1ea1n c\u1ea7n th\u1ef1c hi\u1ec7n c\u00e1c b\u01b0\u1edbc sau:<\/p>\n<ol>\n<li>C\u00e0i \u0111\u1eb7t SignalR: B\u1ea1n c\u00f3 th\u1ec3 c\u00e0i \u0111\u1eb7t SignalR th\u00f4ng qua NuGet Package Manager b\u1eb1ng c\u00e1ch t\u00ecm ki\u1ebfm &#8220;Microsoft.AspNet.SignalR&#8221; v\u00e0 c\u00e0i \u0111\u1eb7t g\u00f3i.<\/li>\n<li>T\u1ea1o Hub: B\u1ea1n c\u1ea7n t\u1ea1o m\u1ed9t Hub \u0111\u1ec3 x\u1eed l\u00fd c\u00e1c y\u00eau c\u1ea7u SignalR v\u00e0 g\u1eedi tin nh\u1eafn \u0111\u1ebfn kh\u00e1ch h\u00e0ng c\u1ee7a b\u1ea1n. B\u1ea1n c\u00f3 th\u1ec3 t\u1ea1o m\u1ed9t Hub b\u1eb1ng c\u00e1ch t\u1ea1o m\u1ed9t l\u1edbp v\u00e0 k\u1ebf th\u1eeba t\u1eeb l\u1edbp &#8220;Hub&#8221; c\u1ee7a SignalR.<\/li>\n<li>C\u1ea5u h\u00ecnh: B\u1ea1n c\u1ea7n c\u1ea5u h\u00ecnh \u1ee9ng d\u1ee5ng c\u1ee7a m\u00ecnh \u0111\u1ec3 s\u1eed d\u1ee5ng SignalR. B\u1ea1n c\u00f3 th\u1ec3 th\u1ef1c hi\u1ec7n \u0111i\u1ec1u n\u00e0y b\u1eb1ng c\u00e1ch th\u00eam c\u00e1c d\u00f2ng m\u00e3 v\u00e0o t\u1ec7p &#8220;Startup.cs&#8221;.<\/li>\n<li>G\u1eedi tin nh\u1eafn: B\u00e2y gi\u1edd b\u1ea1n c\u00f3 th\u1ec3 g\u1eedi tin nh\u1eafn \u0111\u1ebfn kh\u00e1ch h\u00e0ng c\u1ee7a m\u00ecnh b\u1eb1ng c\u00e1ch g\u1ecdi ph\u01b0\u01a1ng th\u1ee9c c\u1ee7a Hub t\u1eeb m\u00e3 JavaScript tr\u00ean trang web c\u1ee7a b\u1ea1n.<\/li>\n<\/ol>\n<p>V\u00ed d\u1ee5 v\u1ec1 s\u1eed d\u1ee5ng SignalR trong MVC:<\/p>\n<p>T\u1ea1o m\u1ed9t l\u1edbp Hub \u0111\u1ec3 x\u1eed l\u00fd c\u00e1c y\u00eau c\u1ea7u SignalR:<\/p>\n<pre>public class ChatHub : Hub\r\n{\r\n    public void Send(string name, string message)\r\n    {\r\n        Clients.All.broadcastMessage(name, message);\r\n    }\r\n}\r\n\r\n<\/pre>\n<p>C\u1ea5u h\u00ecnh \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n \u0111\u1ec3 s\u1eed d\u1ee5ng SignalR:<\/p>\n<pre>public void Configuration(IAppBuilder app)\r\n{\r\n    app.MapSignalR();\r\n}\r\n\r\n<\/pre>\n<p>G\u1ecdi ph\u01b0\u01a1ng th\u1ee9c c\u1ee7a Hub t\u1eeb m\u00e3 JavaScript tr\u00ean trang web c\u1ee7a b\u1ea1n \u0111\u1ec3 g\u1eedi tin nh\u1eafn \u0111\u1ebfn kh\u00e1ch h\u00e0ng c\u1ee7a b\u1ea1n:<\/p>\n<pre>var chat = $.connection.chatHub;\r\nchat.client.broadcastMessage = function (name, message) {\r\n    \/\/ X\u1eed l\u00fd tin nh\u1eafn nh\u1eadn \u0111\u01b0\u1ee3c t\u1eeb m\u00e1y ch\u1ee7\r\n};\r\n$.connection.hub.start().done(function () {\r\n    \/\/ G\u1eedi tin nh\u1eafn \u0111\u1ebfn m\u00e1y ch\u1ee7\r\n    chat.server.send(name, message);\r\n});\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>SignalR l\u00e0 m\u1ed9t th\u01b0 vi\u1ec7n cho ph\u00e9p truy\u1ec1n tin nh\u1eafn th\u1eddi gian th\u1ef1c gi\u1eefa m\u00e1y kh\u00e1ch v\u00e0 m\u00e1y ch\u1ee7. N\u00f3 cho ph\u00e9p c\u00e1c \u1ee9ng d\u1ee5ng web c\u1ee7a b\u1ea1n c\u00f3 th\u1ec3 g\u1eedi v\u00e0 nh\u1eadn c\u00e1c th\u00f4ng tin th\u1eddi gian th\u1ef1c m\u1ed9t c\u00e1ch nhanh ch\u00f3ng v\u00e0 hi\u1ec7u qu\u1ea3. Trong MVC, b\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng SignalR \u0111\u1ec3 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":385,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"amp_status":"","footnotes":""},"categories":[8,10],"tags":[],"class_list":{"0":"post-384","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-net","8":"category-mvc"},"_links":{"self":[{"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/posts\/384","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/comments?post=384"}],"version-history":[{"count":1,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/posts\/384\/revisions"}],"predecessor-version":[{"id":386,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/posts\/384\/revisions\/386"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/media\/385"}],"wp:attachment":[{"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/media?parent=384"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/categories?post=384"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thietkewebdalat.net\/blog\/wp-json\/wp\/v2\/tags?post=384"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}