Служба WCF с SignalR

у меня есть веб-приложение, которое имеет несколько диаграмм На панели инструментов. Данные для диаграмм извлекаются из документа.готовая функция на стороне клиента вызов метода WCF сервиса.

Теперь я хочу использовать SignalR в своем приложении. Я действительно Новичок в SignalR. Как я могу вызвать методы WCF из концентратора SignalR или что вы можете сказать, что вместо извлечения данных с сервера я хочу, чтобы служба WCF передавала данные клиенту каждую минуту.

есть ли способ связи между signalR и службой WCF.

также другим подходом может быть заставить клиента запрашивать данные из службы WCF каждую минуту.

любая помощь будет действительно оценили.

Я сделал следующее до сих пор.

функция на стороне клиента на моей странице приборной панели

<script src="Scripts/jquery.signalR-2.0.3.min.js"></script>
    <!--Reference the autogenerated SignalR hub script. -->
    <script src="/signalr/hubs"></script>
<a id="refresh">Refresh</a>
    $(function() {
            var dashboardHubProxy = $.connection.dashboardHub;
            $.connection.hub.start().done(function() {
                // dashboardHubProxy.server.refreshClient(parameters);
                $("#refresh").click(function() {
                    dashboardHubProxy.server.refreshClient(parameters);
                });
            });
            dashboardHubProxy.client.refreshChart = function (chartData) {
                debugger;
                DrawChart(chartData, 'Hourly Call Count For Last ' + Duration + ' Days', '#chartHourly', 'StackedAreaChart');
            };
        });

и мой класс Dashboard Hub выглядит следующим образом

public class DashboardHub : Hub
{
    private readonly ReportService ReportService = new ReportService();


    public void RefreshClient(string parameters)
    {
        var chartData = ReportService.GenerateHourlyCallsTrendGraphicalReport(parameters);
        Clients.All.refreshChart(chartData);
    }
}

мой класс запуска SignalR выглядит следующим образом

[assembly: OwinStartup(typeof(CallsPortalWeb.Startup), "Configuration")]
namespace CallsPortalWeb
{
    public static class Startup
    {
        public static void Configuration(IAppBuilder app)
        {
            ConfigureSignalR(app);
        }
        public static void ConfigureSignalR(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
}

когда я нажимаю на кнопку Обновить и отладчик на методе RefreshClient на концентраторе отладчик не попадает в метод, что означает, что я не могу вызвать метод SignalR на стороне сервера.

есть ли что-то нужно сделать в интернете.конфиг?

2 ответов


Я согласен с AD.Net комментарий. Чтобы разработать немного больше, концентраторы SignalR могут быть размещены непосредственно в вашем веб-проекте так же, как используются контроллеры. Существует также пакет, чтобы вы могли разместить библиотеку SignalR самостоятельно, чтобы она могла действовать как служба сама по себе. В любом случае вам нужно будет сначала нажать концентратор SignalR, поскольку именно так он взаимодействует, тогда вы вызовете свои методы службы WCF из концентраторов.

Краткая объяснение

ваш концентратор будет иметь методы, используемые как вашим клиентом пользователя, так и клиентом WCF. Вы можете использовать что-то вроде UserConnected() для пользователя, чтобы позвонить и настроить ведение журнала подключения. Затем служба WCF может вызвать ваш концентратор с помощью UpdateUserStats(Guid connnectionId, UserStats stats) который, в свою очередь, вызовет клиент пользователя напрямую и предоставит статистику, переданную так Clients.Client(connectionId).updateStats(stats) который, в свою очередь, будет иметь метод на клиенте пользователей с именем updateStats() это будет обрабатывать полученные информация.

Начальная страница приземления

что AD.Net предоставляется базовый код, который будет вызываться при приземлении пользователя на страницу. На этом этапе вы хотите войти ConnectionId, связанный с этим пользователем, чтобы вы могли напрямую связаться с ними.

первый контакт с концентратором, касаясь WCF

из вашего концентратора вы можете вызвать свою службу WCF, как обычно, внутри любого обычного кода C# для получения ваших данных или выполните действие и верните его пользователю.

метод периодического обновления пользователя

SignalR устраняет необходимость в клиентском коде, чтобы постоянно опрашивать сервер для обновлений. Он предназначен для того, чтобы позволить вам выталкивать данные клиенту без их прямого запроса. Именно здесь в игру вступает постоянство связей.

вы, вероятно, захотите создать обертку, чтобы легко отправлять сообщения в концентратор с вашего поскольку вы используете WCF, я бы предположил, что у вас есть бизнес-логика за этим слоем, поэтому вы захотите, чтобы служба WCF обращалась к вашему концентратору всякий раз, когда происходит действие X. Вы можете сделать это, используя клиентский код C#, так как в этом случае ваш клиент фактически является пользователем и службой WCF. С приложением чата другой пользователь в основном делает то, что вы хотите, чтобы ваша служба WCF, которая отправляет сообщение другому клиенту.

использование пример

вы работаете в интернет-магазине. На панели мониторинга отображается количество заказов за день. Таким образом, вы бы подключили звонок к концентратору, чтобы отправить сообщение для обновления заказанных продуктов, когда пользователь размещает новый заказ. Вы можете сделать это, отправив его в настроенную группу администраторов, и все администраторы на панели мониторинга получат сообщение. Хотя, если эта статистика очень специфична для пользователя, вы, скорее всего, вместо этого доберетесь до базы данных, найдете ConnectionId, с которым пользователь связался, и отправить сообщение об обновлении непосредственно этому connectionid.

пример кода клиента WCF

просто если вы хотите какой-то код, это непосредственно с сайта MS при подключении к клиенту .net. Это можно использовать в службе WCF или в любом месте кода, которое планируется подключить, а затем отправить обновление пользователю.

var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start();

вот ссылка непосредственно на раздел клиента .Net: http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-net-client

Я уверен, что вы видели эту ссылку, но она действительно содержит всю хорошую информацию, необходимую для начала работы. http://www.asp.net/signalr

вот более прямая ссылка, которая входит в обычаи с кодом для вас. http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server

добавлено: вот блог, специфичный для Приборные панели с SignalR и их опросом. http://solomon-t.blogspot.com/2012/12/signalr-and-interval-polling-for.html

добавлено: вот страница об управлении подключениями signalR пользователей. http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections

обновление для обновления кода

клиентская библиотека .Net (в NuGet) предоставляет вашему .net-коду доступ к концентратору. Поскольку вы являетесь клиентом, вы необходимо будет подключиться к концентратору так же, как пользователь, который также является клиентом. Центр будет действовать в качестве сервера для этого. Поэтому с клиентом .Net я предполагаю, что вы настроите службу windows, которая будет внутренне опрашивать или что-то на основе событий, которое вызовет часть кода клиента .Net, которая будет обращаться к вашему концентратору. Ваш концентратор будет принимать предоставленную информацию, скорее всего, ConnectionId или GroupId и широкий пользователь (который, возможно ,находится на веб-сайте, поэтому это будет JS client) метод, который обновит интерфейс для пользовательского клиента. В основном то, что я упоминаю в разделе "краткое описание".

теперь, чтобы напрямую ответить на код, который вы опубликовали. Это Javascript, я ожидал бы подключения, как вы это сделали. Обновление диаграммы при первоначальном подключении также прекрасно. Если это весь код signalR мудрый, хотя вам не хватает метода на стороне клиента для обработки обновления. Технически, вместо того, чтобы звонить клиентам.Абонент.RefreshChart() вы можете просто вернуться эти данные и использовать его, что и делает ваш javascript прямо сейчас. Вы возвращаетесь пустым, но он ожидает вашего свидания.

теперь я бы сказал, исправьте свой javascript вместо исправления кода концентратора. Почему? Потому что метод в JS на вашем клиенте, который называется " refreshChart ()", может быть повторно использован, когда ваш сервер обращается и обновляет клиент.

поэтому я бы рекомендовал, отбросив все, что связано с обновлением приборной панели в ваш JS сделал заявление. Если вы хотите сделать уведомление или что-то для пользователя это хорошо, но не обновлять сетку.

Теперь создайте функцию клиента JS под названием "refreshChart", обратите внимание на нижний регистр R, вы можете вызвать его с большим R в C#, но библиотека js будет строчной, поэтому, когда вы сделаете функцию, она получит информацию о вашей панели мониторинга.

теперь, при опросе сервера или выполнении какого-либо действия, ваш WCF вызовет метод на концентраторе, который будет говорить "UpdateDashboar (connectionId,dashInfo)", и этот метод затем внутри него вызовет "refreshChart" так же, как вы делаете в своем методе RefreshClient, accept вместо выполнения клиентов.Caller вы будете использовать клиентов.Клиент(connectionid содержит).refreshChart (chartInfo).

непосредственно причина, по которой ваш код не работает, заключается в том, что вам нужно превратить этот Void в тип, который вы ожидаете вернуть. Если остальное закодировано правильно, вы будете иметь его обновление один раз. Вам нужно будет реализовать другая логика, которую я упомянул, если вы хотите ее постоянно обновлять. Вот почему я снова спросил о том, как вы сохраняете свои связи. Я добавил ссылку, чтобы помочь вам в этом, если вы не уверены, о чем я говорю.


вы должны использовать SignalR Hub для передачи данных клиенту. Ваш hub использовать WCF service (точно так же как client can), чтобы получить данные.

С client:

    hub.VisitingDashBoard();

на hub на VisitingDashBoard способ:

var data = wcfClient.GetDashboardData()//may be pass the user id from the context
         Clients.Caller.UpdateDashboard(data)

конечно ваш client будет иметь обработчик для UpdateDashboard вызов