2012-10-12 19 views
7

Mam następujący setupWysyłanie danych do strony internetowej z usługą WCF

  • Witryna jQuery (nie dokładnie jedna strona, ale nie daleko od niego), który wykorzystuje
  • A ASP.NET MVC jako backend, który łączy się (przez net.tcp lub net.pipe) z
  • Samohostowaną usługą WCF, która zarządza i łączy się z
  • Mnóstwo zewnętrznych usług o dużym opóźnieniu.

Tak więc, gdy klient naciska przycisk, żądanie jest wysyłane do MVC, który kieruje go do WCF, który agreguje go z zewnętrznych usług, i wszystko jest w porządku i jest eleganckie.

Kwestia, której nie mogę omijać, to komunikowanie się w inny sposób, tj. Kiedy jedna z zewnętrznych usług przechodzi w tryb offline, jaki jest najłatwiejszy i najbardziej elegancki sposób poinformowania klienta (przeglądarki)?

Oznacza to, że usługa powinna w jakiś sposób informować witrynę mvc, która powinna w jakiś sposób poinformować klienta, że ​​usługa zewnętrzna jest w trybie offline.

Dodatkowo: usługa zewnętrzna będzie miała wysoką dostępność, więc scenariusz "idzie w tryb offline" będzie rzadko używany, a zatem szukam rozwiązania, które nie zapewnia obszernego odpytywania serwera.

+0

Jak zdefiniować "offline"? Chwilowo nieosiągalny? Zamykać w celu konserwacji przez administratora w serwisie zewnętrznym? Czy jest to ściśle związane z "planowanymi" awariami, czy też chcesz z wdziękiem obsłużyć każdą niemożność skontaktowania się ze zdalnymi usługami? –

+0

@RickLiddle "idzie w ciemno" może być lepszym słowem. Zasadniczo, gdy usługa zewnętrzna (która jest poza moim rozkazem) nie reaguje tak, jak powinna. – SWeko

+0

Gorąco polecam sugestię SignalR dostarczoną przez JcFx [poniżej] (http://stackoverflow.com/a/12863194/35241). –

Odpowiedz

4

Pracuję nad podobną architekturą i planuję użyć SignalR do przesyłania aktualizacji z WCF (czasami bezpośrednio, czasami za pośrednictwem usługi Azure Service Bus) do aplikacji JQuery z jedną stroną. Nie wdrożyłem tego jeszcze, więc mogą być pewne problemy, których nie rozważałem.

Z ich docs:

Pchanie danych z serwera do klienta (nie tylko klientów Browser) zawsze był trudny problem. SignalR sprawia, że ​​jest on łatwy w obsłudze, a radzi sobie z wszystkimi ciężkimi ładunkami.

Scott Hansleman ma dobry blog na ten temat tutaj: http://www.hanselman.com/blog/AsynchronousScalableWebApplicationsWithRealtimePersistentLongrunningConnectionsWithSignalR.aspx

+0

Wycofane - doskonałe rozwiązanie, które zapewnia realną odpowiedź na problem i obejmuje świetne zasoby. To jest IMO, model tego, czym powinna być odpowiedź na temat StackOverflow. –

1

Możesz użyć fault exceptions, aby zwrócić dane wyjątku do klienta.

Wolę mieć flagę IsSuccessful na moich zwróconymi kontraktach i zgłaszam tylko wyjątki błędu, gdy wystąpi błąd krytyczny. Jest to bardzo prosty przykład umowy o udzielenie odpowiedzi z flagą IsSuccessful.

[DataContract] 
public class MyResponse 
{ 
    [DataMember] 
    public bool IsSuccessful { get { return Message == null || !Messages.Any(); } set { } } 
    [DataMember] 
    public List<string> Messages { get; set; } 
} 

Messages może być złożone typy jeśli trzeba dostarczyć bardziej szczegółowych informacji. Atrybuty DataContract i DataMember mogą być MessageContract i MessageBodyMember, jeśli lepiej pasują do Twojej architektury.

+0

nie jest prosty Json o wiele łatwiejszy? – lboshuizen

+0

Być może nie zadeklarowałem tego pytania, przepraszam. Nie ma żądania od klienta, serwer powinien zainicjować komunikację. – SWeko

0

Typowy scenariusz z funkcją WCF i przeglądarką to wzorzec żądania/odpowiedzi. Przeglądarka wysyła żądanie, a usługa odpowiada.

Możesz pozwolić przeglądarce okresowo odpytywać usługę szukającą statusu.

+0

Usługa zewnętrzna będzie miała wysoką dostępność, więc scenariusz "idzie w tryb offline" będzie rzadko używany, a zatem szukam rozwiązania, które nie zapewnia obszernego odpytywania serwera. – SWeko

+0

W takim przypadku po prostu zwróć błąd, gdy usługa zewnętrzna jest w trybie offline, a przeglądarka wysyła żądanie, które tego wymaga. –

+0

Już to robię, ale teraz muszę informować proaktywnie :) – SWeko

1

Wydaje mi się, że konieczne jest wdrożenie usługi odpytywania w celu sprawdzenia dostępności usług zewnętrznych.

+0

To jest już zaimplementowane na poziomie usługi WCF, a na życzenie klienta dostępne dla klienta. Problem polega na tym, że teraz muszę wysłać go do klienta w sposób sterowany zdarzeniami. – SWeko

+0

Co to jest klient? Czy to jest oparte na sieci? – mojo722

+0

Tak, tak opisałem. – SWeko

0

W Discovery Namespace dostępna jest funkcja umożliwiająca usłudze WCF wysyłanie komunikatów wykrywania. Jeśli masz zaplanowaną awarię, AnnouncementClient class ma metody dla usługi publikowania wiadomości o przejściu w tryb offline/online.

Aby ustawić niestandardową wiadomość dla użytkowników, należy wysłuchać tych wiadomości z ogłoszeniami. Klasa, która to implementuje, to AnnouncementService. Ma zdarzenia do obsługi wiadomości Offline i Online.

Powiązane problemy