2014-06-12 25 views
8

Mam aplikację internetową, która ma niewiele wykresów na desce rozdzielczej. Dane do wykresów są pobierane na document.ready funkcja po stronie klienta wywołująca metodę usługi WCF.Usługa WCF z SignalR

Teraz chcę użyć SignalR w mojej aplikacji. Jestem naprawdę nowy w SignalR. Jak mogę wywołać metody WCF z SignalR Hub lub co można powiedzieć, że zamiast ciągnąć dane z serwera, chcę, aby usługa WCF przesyłała dane do klienta co minutę.

Czy istnieje sposób komunikacji między usługą signalR i WCF.

Innym podejściem może być zmuszanie klienta do żądania danych z usługi WCF co minutę.

Każda pomoc będzie naprawdę doceniana.

Podjąłem od teraz.

Client Funkcja Side na mojej stronie Panel

<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'); 
      }; 
     }); 

i moim Dashboard klasy Hub jest następujący

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


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

Moja SignalR klasa startowy jest następujący

[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(); 
     } 
    } 
} 

Po kliknięciu na przycisku odświeżania i debuggerze w metodzie RefreshClient na koncentratorze, debugger nie dociera do mety hod, co oznacza, że ​​nie mogę wywołać metody SignalR po stronie serwera.

Czy należy coś zrobić w web.config?

+0

Jedyną rzeczą, której naprawdę chcę, jest umożliwienie serwerowi przesyłania danych do deski rozdzielczej. –

+0

Niestety, nie zamierzamy tego dla ciebie kodować, możesz podać kod, a my pomożemy go wyjaśnić i udoskonalić. Zamieszczone poniżej linki wyjaśniają SignalR, że nie jest czymś, co w magiczny sposób musisz przeczytać i dowiedzieć się o tym, że dostarczyłem zasoby, aby to zrobić. Jeśli nie podasz kodu, którego próbowałeś, nie będziesz w stanie znaleźć odpowiedzi, której szukasz, ponieważ nie mamy nic, czym moglibyśmy Cię skierować. – Tony

+1

Aby dalej rozwinąć mój komentarz, czy wiesz, że SignalR nie utrzymuje połączeń? W jaki sposób planujesz przechowywanie osób, które są połączone, a które niezależnie od grupy i kto dostanie te aktualizacje, które chcesz przesłać do pulpitów nawigacyjnych, czy korzystasz z kolekcji statycznej lub przechowujesz ją w bazie danych, czy zamierzasz używać wiele serwerów? Czy ten użytkownik deski rozdzielczej jest konkretny, czy przesyłasz dane do całego świata? Za sygnałem jest znacznie więcej niż tylko wysłanie wiadomości i aktualizacja ui z serwera. – Tony

Odpowiedz

11

zgadzam się z Ad.net-tych komentarz. Aby nieco bardziej rozwinąć, ośrodki SignalR mogą być hostowane bezpośrednio w projekcie sieciowym w taki sam sposób, w jaki używane są kontrolery. Jest tam także pakiet, więc możesz samodzielnie obsługiwać bibliotekę SignalR, aby mogła sama działać jako usługa. W obu przypadkach musisz najpierw uderzyć w koncentrator SignalR, ponieważ w ten sposób komunikujesz się, a następnie wywołasz metody usługi WCF z poziomu koncentratorów.

Krótkie wyjaśnienie

koncentratora będą miały metody stosowane zarówno przez Twojego Klienta użytkownika i WCF Client. Możesz użyć czegoś takiego, jak UserConnected(), aby użytkownik mógł zadzwonić i skonfigurować rejestrację połączenia.Następnie usługa WCF może wywołać twój HUB z numerem UpdateUserStats(Guid connnectionId, UserStats stats), który z kolei wywoła klienta USER bezpośrednio i przekaże statystyki przekazane w ten sposób, tak Clients.Client(connectionId).updateStats(stats), które z kolei będą miały metodę na kliencie USERS o nazwie updateStats(), która będzie obsługiwać odebrane informacje.

strona początkowa lądowanie

Co Ad.net warunkiem jest podstawowy kod, który zostanie wywołany, gdy użytkownik trafi na stronie. W tym momencie należy zalogować się do ConnectionId powiązanego z tym użytkownikiem, aby móc bezpośrednio skontaktować się z nim.

Pierwszy kontakt z koncentratora dotykania WCF

ze swojego Hub, można wywołać usługę WCF jak normalnie wewnątrz każdej normalnej kodu C# do pobierania danych lub wykonywania czynności i zwrócić go do użytkownika.

Sposób aktualizowania użytkownikowi okresowo

SignalR usuwa potrzebę kod klienta, aby mieć do ciągłego odpytywania serwera aktualizacji. Ma to na celu umożliwienie przesyłania danych do klienta bez ich proszenia o to bezpośrednio. Tu zaczynają działać uporczywe połączenia.

Prawdopodobnie będziesz chciał utworzyć wrapper, aby łatwo wysyłać wiadomości do koncentratora z aplikacji, ponieważ używasz WCF Zakładam, że masz logikę biznesową za tą warstwą, więc będziesz chciał, aby usługa WCF docierała do twojej Koncentrator, gdy dzieje się akcja X. Możesz to zrobić, używając kodu C# po stronie klienta, ponieważ w tym przypadku klient jest faktycznie użytkownikiem i usługą WCF. W przypadku aplikacji do czatu drugi użytkownik robi zasadniczo to, co ma zrobić usługa WCF, co oznacza wysłanie wiadomości do drugiego klienta.

Przykład użycia

Używasz sklepu internetowego. Pulpit wyświetla liczbę zamówień na dany dzień. Więc możesz połączyć się z centrum, aby wysłać wiadomość, aby zaktualizować produkty zamówione, gdy użytkownik złoży nowe zamówienie. Możesz to zrobić, wysyłając go do skonfigurowanej grupy administratorów, a wszyscy administratorzy na desce rozdzielczej otrzymają wiadomość. Chociaż statystyki te są bardzo specyficzne dla użytkownika, bardziej prawdopodobne jest sięgnięcie do bazy danych, znalezienie adresu ConnectionId, z którym użytkownik się połączył, i wysłanie komunikatu aktualizacji bezpośrednio do tego elementu connectionid.

kod klienta WCF Przykład

Wystarczy okrywać chcesz jakiś kod, to jest bezpośrednio ze strony MS po podłączeniu z klientem .NET. Możesz użyć tego w swojej usłudze WCF lub gdziekolwiek w kodzie planujesz połączenie, a następnie wysłanie aktualizacji do użytkownika.

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(); 

Tu jest link bezpośrednio do działu Client .NET: http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-net-client

Jestem pewien, że widziałem ten link, ale to naprawdę posiada wszystkie dobre informacje, których potrzebujesz, aby zacząć. http://www.asp.net/signalr

Oto bardziej bezpośredni odsyłacz do kodu użytkownika.http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server

DODANO: Oto blog charakterystyczny dla pulpitów z SignalR i ich pollingu. http://solomon-t.blogspot.com/2012/12/signalr-and-interval-polling-for.html

DODANO: Oto strona na temat zarządzania użytkownikami połączeń signalR. http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections

Aktualizacja do aktualizacji kodu

biblioteki Client .NET (w Nuget) daje dostęp do kodu .NET do piasty. Ponieważ jesteś klientem, będziesz musiał połączyć się z centrum, tak jak użytkownik, który jest również klientem. Twój serwer pełniłby rolę serwera. Tak więc z klientem .Net zakładam, że skonfigurowałbyś usługę Windows, która wewnętrznie odpytuje, lub coś opartego na zdarzeniu, które wywoływałoby część kodu tego klienta .Net, która docierałaby do twojego centrum. Twój koncentrator przejąłby przekazane informacje, najprawdopodobniej ConnectionId lub GroupId, a także szerokie rzucenie użytkownika (który jest prawdopodobnie na stronie internetowej, więc byłby to klient JS), metodą, która aktualizowałaby front-end dla klienta użytkownika. Zasadniczo o czym wspominam w "Krótkim objaśnieniu".

Teraz, aby bezpośrednio odpowiedzieć na opublikowany kod. To jest JavaScript, spodziewałbym się takiego połączenia jak ty. Aktualizacja wykresu przy pierwszym połączeniu jest również dobra. Jeśli jest to cały kod signalR mądry, chociaż brakuje metody po stronie klienta, aby obsłużyć odświeżenie. Technicznie, zamiast wywoływać Clients.Caller.RefreshChart(), możesz po prostu zwrócić te dane i użyć ich, co właśnie robi twój javascript. Zwracasz pustkę, ale spodziewasz się randki.

Teraz, powiedziałbym poprawi twój javascript zamiast korygowania kodu piasty. Czemu? Ponieważ posiadanie metody w JS na kliencie, która nazywa się "refreshChart()", może być ponownie użyte, gdy serwer jest dostępny i aktualizuje klienta.

Polecam, upuszczając wszystko, co wiąże się z aktualizacją pulpitu w instrukcji JS done. Jeśli chcesz zrobić powiadomienie lub coś dla użytkownika, które jest w porządku, ale nie aktualizuj siatki.

Teraz utworzymy funkcję klienta JS o nazwie "refreshChart", zanotuj małą literę R, możesz nazwać ją dużą literą R w języku C#, ale biblioteka js będzie pisała małe litery, więc po utworzeniu tej funkcji otrzymasz swój pulpit nawigacyjny Informacja.

Teraz, podczas odpytywania serwera lub wykonania jakiejś akcji, twoje WCF wywołałoby metodę na hubie, która brzmiałaby "UpdateDashboar (connectionId, dashInfo)" i ta metoda mogłaby wtedy w niej zadzwonić "refreshChart" "tak jak robisz w swojej metodzie RefreshClient, zaakceptuj zamiast robić Clients.Caller używałbyś Clients.Client (connectionId) .refreshChart (chartInfo).

Bezpośrednio powodem, dla którego twój kod nie działa, jest to, że musisz zmienić ten Void na typ, który ma zostać zwrócony. Jeśli reszta jest zakodowana poprawnie, będziesz ją aktualizować raz. Będziesz musiał zaimplementować inną logikę, o której wspomniałem, jeśli chcesz ją stale aktualizować. To znowu jest powód, dla którego zapytałem o to, jak utrzymujesz swoje połączenia. Dodałem link, aby ci w tym pomóc, jeśli nie masz pewności, o czym mówię.

+0

Dodałem kod do mojego pytania, aby pokazać, co zrobiłem jeszcze –

+0

ponownie edytowałem mój kod i nadal nie mogę zadzwonić do metody po stronie serwera na koncentratorze. Czy możesz mnie kontrolować i prowadzić przez to? –

9

Powinieneś użyć SignalR Hub, aby przesłać dane do klienta. Twój hub może zużywać WCF service (w ten sam sposób, co Twój client może), aby uzyskać dane.

z client:

hub.VisitingDashBoard(); 

na hub w metodzie VisitingDashBoard:

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

Oczywiście Twój client będzie miało obsługi dla UpdateDashboard rozmowy

+0

Jakąkolwiek próbkę kodu do tego? –