King Fisher Ответов: 1

Как отправить ответ клиентам на основе пользователя в signalr


Поток приложений:

рассмотрим клиентское приложение выполняется в отдельной среде, применение веб-API выполняется в отдельной среде.

вот мой код концентратора для проекта web api :
public class NotifyHub : Hub
    {
        public NotifyHub()
        {
            var request = new PushNotificationRequest
            {
                FilterProperty = new Common.Filters.FilterProperty { Offset = 0, RecordLimit = 0, OrderBy = "datechecked desc" },
                Filters = new List<Common.Filters.FilterObject> { new Common.Filters.FilterObject { LogicOperator = 0, ConditionOperator = 0, Function = 0, FieldName = "", FieldValue = "", FieldType = 0 } }
            };
            Int16 userId = 3134;
            Int16 usertypeid = 1;
            INotificationManager inotifity = new NotificationManager();
            var taskTimer = Task.Factory.StartNew(async () =>
            {
                while (true)
                {
                    //var serviceProxy = new NotificationServiceProxy();
                    var NotificationResult = inotifity.PublishResultsAsync(request, userId, usertypeid);
                    //Sending the server time to all the connected clients on the client method SendServerTime()
                    Clients.All.NotificationToClient(NotificationResult);

                    //Delaying by 60 seconds.
                    await Task.Delay(60000);
                }
            }, TaskCreationOptions.LongRunning
              );
        }
    }


из приведенного выше кода Вы можете видеть , Int16 userId = 3134;

На самом деле она должна быть динамичной. В клиентском приложении, если userid 3134 вошел в систему, я должен отправить ответные данные, которые принадлежат 3134.

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

как я могу этого достичь?

Код клиентского приложения для подключения концентратора:
var app = angular.module('app', []);
app.value('$', $);

app.factory('NotificationService', function ($, $rootScope) {
    return {
        proxy: null,
        initialize: function (NotificationToClientCallback) {
            //Getting the connection object
            var connection = $.hubConnection("http://localhost:50728/");

            //Creating proxy
            this.proxy = connection.createHubProxy('NotifyHub');

            //Attaching a callback to handle NotificationToClient client call
            this.proxy.on('NotificationToClient', function (message) {
                $rootScope.$apply(function () {
                    NotificationToClientCallback(message);
                });
            });

            //Starting connection
            connection.start({ jsonp: true })
           .done(function () { console.log('Now connected, connection ID=' + connection.id); })
           .fail(function () { console.log('Could not connect'); });

        },
        sendRequest: function (callback) {
            //Invoking SendNoficationRequest method defined in hub
            this.proxy.invoke('SendNoficationRequest');
        }
    }
}).controller('NotificationCtrl', ['$scope', 'NotificationService', function NotificationCtrl($scope, NotificationService) {
        $scope.text = "";

        $scope.SendNoficationRequest = function () {
            NotificationService.sendRequest();
        }

        updateDisplayData = function (text) {
            $scope.text =  text;
        }
        NotificationService.initialize(updateDisplayData);

    }]);


Что я уже пробовал:

Я искал о том, как передать параметры для хаба, но я не могу двигаться дальше.

1 Ответов

Рейтинг:
6

Jean-Claude ADIBA

Привет,

В Hub свойства у вас есть Context свойство и вы можете получить доступ к текущему пользователю, который отправит запрос следующим образом :

Int16 userId = Context.User.Identity.Name;
Это будет хорошо работать, если вы используете Forms Authentification Mode чтобы сохранить идентификатор подключенного пользователя в вашем Login method подобный этому :
FormsAuthentication.SetAuthCookie(model.UserId.ToString(), false);
Этот код создает билет аутентификации для предоставленного имени пользователя и добавляет его в коллекцию файлов cookie.

Не забудьте установить это в вашем файле webconfig, чтобы указать, что вы используете Forms Authentification Mode
<system.web>
  <authentication mode="Forms">
    <forms loginUrl="~/Account/Login" timeout="2880" />
  </authentication>
</system.web>

Как передать параметры для хаба ?

Я благодарю вас за то, что вы можете передать данные в Hub от клиента передайте аргументы методу, как это.
proxy.invoke('methodName',arguments)
Если вы хотите, чтобы данные были доступны для всего сеанса, вы можете сохранить их в файлах cookie и получить в Hub посредством Context.RequestCookies собственность.


Я надеюсь, что это поможет. ;)

Ссылка :
Руководство по API с помощью SignalR хабы ASP.NET - JavaScript-клиента | сайта ASP.NET [^]


King Fisher

спасибо, я только что передал userId в качестве параметра

Jean-Claude ADIBA

Отличный. если это поможет вам, вы можете отметить мой ответ как одобренное решение.

King Fisher

Я просто включил ссылку, спасибо :) можете ли вы, пожалуйста, разобраться в этом?
новый вопрос