Thiết lập SignalR trong dự án Sitecore

SignalR là một thư viện của Microsoft mà cho phép nhà phát triển để làm nên những chương trình realtime. Đây thực sự là tiện lợi cho bạn nếu bạn đang xây dựng những chương trình chat hoặc bạn muốn đẩy những tin hot vào website từ server tin tức nào đó.

Đầu tiên là cài SignalR và thiết lập Owin startup

Chạy câu lệnh sau trong Package Manager Console đối với project đích của bạn

Install-Package Microsoft.AspNet.SignalR
Install-Package Owin

Bây giờ chúng ta cần khởi tạoSignalR on startup. Chúng ta có thể làm điều này nhờ lớp Owin startup

using System;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Configuration;
using Microsoft.Owin;
using Owin;
using Sitecore.Diagnostics;

[assembly: OwinStartup(typeof(SignalR.Example.Startup))]
namespace SignalR.Example
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Any connection or hub wire up and configuration should go here
            Log.Info("Initializing log SignalR service...", this);
            app.MapSignalR("/sitecore/signalr", new HubConfiguration() { });
        }
    }
}

Tạo ra mới SignalR hub

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNet.SignalR;

namespace SignalR.Example
{
    public class SignalRHub : Hub
    {
        public void CallMeM()
        {            
            Clients.All.onUpdate("This is an update from the server");                   
        }

        public override Task OnConnected()
        {
            //You can also handle new connections here
            return base.OnConnected();
        }        

        public override Task OnDisconnected(bool stopCalled)
        {
            //And handle the disconnected clients here       
            return base.OnDisconnected(stopCalled);
        }
    }
}

Làm Sitecore bỏ qua những yêu cầu tới dịch vụ SignalR

Có một điều mà hay bị quên khi bắt đầu sử dụng một dịch vụ SignalR mới. Không may là Sitecore không biết gì về sự tồn tại của SignalR và cố gắng trao những yêu cầu đến và tìm chúng để phục vụ, cho nên nếu bạn gọi service của bạn thì bây giờ bạn sẽ nhận được lỗi 404.

Để có thể fix được lỗi này chúng ta cần add một pipeline mà sẽ bỏ qua hết những yêu cầu này nếu chúng là dùng cho việc sử dụng SignalR.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Sitecore;
using Sitecore.Configuration;
using Sitecore.Diagnostics;
using Sitecore.Pipelines.HttpRequest;

namespace SignalR.Example
{
    public class IgnoreSignalRPath : HttpRequestProcessor
    {
        #region Public methods

        /// <summary>
        /// Runs the processor.
        /// </summary>
        /// <param name="args">The arguments.</param>
        public override void Process([NotNull] HttpRequestArgs args)
        {
            Assert.ArgumentNotNull(args, nameof(args));
            if (args.Url.FilePath.StartsWith("/sitecore/signalr", StringComparison.OrdinalIgnoreCase))
            {
                args.AbortPipeline();
            }
        }

        #endregion
    }
}

Thêm vào file patch

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <sitecore>
    <pipelines>
      <httpRequestBegin>
        <processor type="SharedSource.LogTail.Pipelines.IgnoreSignalRPath, SharedSource.LogTail"
                   patch:before="processor[@type='Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel']"/>
      </httpRequestBegin>
    </pipelines>
  </sitecore>
</configuration>

Bây giờ bạn có thể dùng dịch vụ SignalR

  <script src="<%= ResolveUrl("~/Scripts/jquery-1.6.4.min.js") %>"></script>
    <!--Reference the SignalR library. -->
    <script src="<%= ResolveUrl("~/Scripts/jquery.signalR-2.2.1.min.js") %>"></script>
    <!--Reference the autogenerated SignalR hub script. -->
    <script src="/sitecore/signalr/hubs"></script>
    <!--Connect here using SignalR JS script--> 
    <script type="text/javascript">
        $(function () {
            function startHub() {
                //$.connection.hub.logging = true;
                $.connection.hub.start({ transport: 'longPolling' }).done(function () {
                    //Invoke server method here.
                    chat.invoke("CallMe");
                    console.log("Connection successful...");
                }).fail(function () {
                    console.log("Connection failed...");
                    setTimeout(function () {startHub(); }, 2000); // Restart connection after 5 seconds.
                });
            }

            // Declare a proxy to reference the hub. 
            var chat = $.connection.signalRHub;
            // You can handle the server updates using JS functions like this
            chat.client.onUpdate = function (contents) {
                console.log("Update from server is here - "+contents);
            };

            //This SignalR handlers could come handy!
            $.connection.hub.disconnected(function () {
                console.log("Lost connection... Reconnecting in 2 seconds...");
                setTimeout(function () { startHub(); }, 2000); // Restart connection after 5 seconds.
            });

            $.connection.hub.connectionSlow(function () {
                console.log('We are currently experiencing difficulties with the connection.')
            });

            $.connection.hub.error(function (error) {
                console.log('SignalR error: ' + error);            
            });

            $.connection.hub.reconnecting(function (cb) {
                console.log("Connection failed... Reconnecting in 2 seconds");
            });
            
            $.connection.hub.reconnected(function (cb) {
                console.log('Reconnected');
            });
            
            // Start the connection.
            startHub();
        });
</script>

Nguồn : https://medium.com/@jackspektor/short-guide-to-how-to-setup-signalr-in-sitecore-solution-cee348e0c991