Pytanie W jaki sposób aplikacja Metro w Windows 8 może komunikować się z aplikacją backendową na tym samym komputerze?


W sytuacji, gdy interfejs użytkownika interfejsu użytkownika jest zbudowany w nowym stylu Metro dla aplikacji Windows 8, i chcesz, aby komunikował się z aplikacją .NET działającą na komputerze lokalnym na tym samym komputerze lokalnym (np. Aplikacja usługi Windows).

Jakie formy komunikacji międzyprocesowej są dostępne między aplikacją metra a aplikacją komputerową?

Podziękowania dla Pavela Minaeva z zespołu Visual Studio, który podał kilka wstępnych informacji w komentarzu:

Według Martyn Lovell, nie ma żadnego zamierzonego mechanizmu   to, a niektóre, które można do tego wykorzystać, są celowo ograniczone.   Na przykład nie ma nazwanych potoków ani plików odwzorowanych w pamięci.   Istnieją gniazda (w tym gniazda serwerów), ale po podłączeniu do   localhost, możesz połączyć się tylko z tą samą aplikacją. Możesz użyć normalnego   pliki w jednym z udostępnionych "znanych folderów" (Dokumenty, Obrazy itp.),   ale jest to dość brutalne włamanie, które wymaga sondowania i jest   widoczne dla użytkownika. - Pavel Minaev komentując ten przypadek

Tak więc w przypadku braku normalnego podejścia myślałem o korzystaniu z usług sieciowych lub odczytywaniu / zapisywaniu danych w bazie danych, aby uzyskać pewną formę komunikacji, z których oba wydają się przesadą, gdy procesy są uruchomione na tym samym komputerze.

Czy to, co tutaj próbuję, ma sens? Widzę potrzebę, aby aplikacja metra była interfejsem użytkownika interfejsu dla istniejącej usługi uruchomionej na pulpicie. A może lepiej użyć WPF do interfejsu użytkownika na interfejsie użytkownika (na przykład do aplikacji innej niż metro).


116
2017-09-19 00:59


pochodzenie


A co z lokalną usługą WCF? - Gleno
@Gleno, które byłyby objęte "myśleniem o korzystaniu z usług internetowych" w pytaniu. To powiedziawszy, zastanawiam się, czy to zadziała - jeśli implementacja biblioteki klienta WCF, która jest dostarczana w .NET Core, jest zbudowana na gniazdach WinRT, to prawdopodobnie miałoby zastosowanie to samo ograniczenie "no localhost". To musi być sprawdzone. - Pavel Minaev
Wygląda na to, że NetNamedPipeBinding i NetTcpBinding (over localhost) WCF nie byłyby dostępne ze względu na ograniczenia w metrze. To zostawiłoby usługi sieciowe lub powiązania MSMQ? Nie jestem pewien, czy sam WCF jest dostępny w metrze, żeby być szczerym. - dodgy_coder
Pozwól, że odpowiem ci na pytanie i zapytam: co się stanie, jeśli usługa komputerowa, z którą się komunikujesz, nie będzie obecna? Pamiętaj, że twoja aplikacja może być zainstalowana tylko ze sklepu i dlatego nie może polegać na obecności usługi pulpitu. - Larry Osterman
Wygląda na to, że przedsiębiorstwa mogą przesuwać niestandardowe aplikacje i ominąć Sklep Windows. Jeśli tak, to miałoby sens założenie, że niektóre aplikacje działały w środowisku przedsiębiorstwa. To powiedziawszy, myślę, że oryginalny plakat powinien używać frontendu WPF dla swoich celów. - Ankur Goel


Odpowiedzi:


W tej chwili przenoszę istniejący projekt do Win8. Składa się z usługi systemu Windows i aplikacji na tace, które rozmawiają ze sobą za pośrednictwem NamedPipes WCF. Jak być może już wiesz, Metro nie obsługuje nazwanych potoków. Skończyło się na użyciu TcpBinding do połączenia full duplex.

Ten post opisuje, która funkcja jest obsługiwana.

Przykładem mojego serwera WCF, który może pobrać klient Metro tutaj.

Pamiętaj też, że nie możesz używać synchronicznego WCF w Metro. Będziesz musiał użyć Zadaniena bazie, która jest tylko asynchroniczna.

I dziękuję za twoje pytanie. Byłem dla mnie dobrym punktem wyjścia :)


54
2018-02-21 07:28



Dzięki za to ... to świetna pomoc. Dobrze jest zobaczyć praktyczną odpowiedź, zamiast po prostu powiedzieć, że nie powinno / nie można tego zrobić. - dodgy_coder
To może być głupie pytanie ... ale możesz połączyć się z localhost za pomocą swojej próbki, czy nie? Pytanie, które łączysz, pokazuje wewnętrzne elementy Visual Studio (wywnioskowałem je ze ścieżki, ale jeśli się mylę, popraw mnie). Czy WCF (w połączeniu z localhost) działa poza WCF? - dzendras
@dzendras Pewnie, to zadziała. Będzie działać również z localhostem. - expert
Wątpię jednak, by taka aplikacja mogła przejść przez certyfikację Sklepu. - Ani
Jeśli cokolwiek to jest zasada, którą myślę, że może być cytowane "3.9 Cała logika aplikacji musi pochodzić i znajdować się w pakiecie aplikacji. Aplikacja nie może próbować zmieniać ani rozszerzać zawartości pakietu za pomocą dowolnej formy dynamicznego dołączania kodu lub danych, które zmieniają sposób interakcji aplikacji z systemem wykonawczym systemu Windows, lub zachowuje się w odniesieniu do polityki sklepu. Niedopuszczalne jest na przykład pobieranie zdalnego skryptu, a następnie wykonywanie tego skryptu w lokalnym kontekście pakietu aplikacji. " - Ani


Było wiele pytań na ten temat pod koniec // kompilacji / sesji, w której uczestniczyłem. Aleš Holeček, który wykonał jedną z dużych sesji zdjęciowych, wyszedł z widowni, aby poradzić sobie z nimi. Nawet jeśli nie jesteś programistą C ++, pobierz tę sesję i obejrzyj pytania i odpowiedzi. http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C

Aplikacje Metro nie mogą liczyć na instalowanie aplikacji komputerowych lub usług na komputerze. Aplikacje na komputery stacjonarne nie mogą liczyć na uruchomione aplikacje Metro, ponieważ mogą zostać zawieszone w dowolnym momencie. Musisz zacząć myśleć inaczej. Posłuchaj Aleša na ten temat.


38
2017-09-19 02:51



To dokładne pytanie pojawia się w filmie na 47:20. - Pavel Minaev
... i jeszcze jeden o 55:00. Odpowiedź, na ogół mówiąc, wydaje się "nie możesz tego zrobić". - Pavel Minaev
@Dodgy_coder Nie jestem pewien, czy WCF / TCP (lub HTTP) działałby na tym samym komputerze. Jeśli sandbox nie pozwala ci się połączyć localhost bezpośrednio przez gniazdo TCP, dlaczego pozwoliłoby ci zrobić to samo poprzez WCF? - Pavel Minaev
Co ciekawe, wbudowano obsługę komunikacji między dwiema aplikacjami metra za pośrednictwem udostępniać kontrakty ale wydaje się to być podobne do użycia w schowku i do przeniesienia w jedną stronę z aplikacji źródłowej do aplikacji docelowej, zamiast do implementacji, powiedzmy, dwukierunkowego protokołu komunikacyjnego. - dodgy_coder
Wydaje mi się, że poboczne aplikacje LOB Metro nie miałyby problemu w zależności od zainstalowanej aplikacji lub usługi. Trudno mi uwierzyć, że ten bardzo praktyczny scenariusz nie będzie wspierany. W przypadku Silverlight obserwowaliśmy stopniowy wzrost możliwości współdziałania między komputerami i natywnymi ... Jestem prawie pewien, że coś z tych scenariuszy (nazwanych potoków lub plików mapowanych w pamięci lub coś podobnego ...) będzie obsługiwane (z dokumentami z poradami) w przyszłości. - David Cuccia


Zauważ, że dzięki aktualizacji Windows 8.1 komunikacja między aplikacjami Windows Store i komponentami komputerowymi napisanymi w języku C # dla .NET 4.5+ jest obecnie oficjalnie wspierana dla aplikacji pobocznych w scenariuszach Enterprise:

Powiązane składniki środowiska wykonawczego systemu Windows dla pobocznych aplikacji Windows Store

Cytować:

Uznając, że kluczowe funkcje biznesowe i reguły są zawarte w istniejących zasobach oprogramowania i przedsiębiorstwa mają wiele różnych scenariuszy, dla których nowy styl aplikacji będzie bardzo wydajny, aktualizacja Windows 8.1 zawiera nową funkcję o nazwie Brokeed Windows Runtime Components dla pobocznych Aplikacje. Używamy terminu IPC (komunikacja między procesami) w celu opisania możliwości uruchamiania istniejących zasobów oprogramowania komputerowego w jednym procesie (komponencie desktop) podczas interakcji z tym kodem w aplikacji Windows Store. Jest to znany model dla programistów w przedsiębiorstwach, ponieważ aplikacje baz danych i aplikacje wykorzystujące usługi NT w systemie Windows mają podobną architekturę wieloprocesową.

Chociaż wdrożenie tego podejścia jest początkowo nieco skomplikowane, pozwala na głęboką integrację ze sklepem Windows i komponentami pulpitu. Należy pamiętać, że na razie nie przejdzie ono publicznej certyfikacji Windows Store.


11
2017-08-25 12:50





Tam jest artykuł na InfoQ o tym, jak budować luźno powiązane aplikacje Metro z procedurami obsługi protokołów. Jest to coś, co było wspierane przez system Windows od dłuższego czasu i można było przewidzieć, że aplikacja desktopowa rejestruje się jako program obsługi protokołu i być może aplikacja Metro może komunikować się za pośrednictwem tego mechanizmu.

Nie mam pojęcia, czy jest to możliwe, ale może być interesujące, aby sprawdzić.


5
2017-09-21 08:41



Artykuł mówi: "Sposób, w jaki można to zrobić w Metro [przeskakiwanie do innego przepływu pracy w innej aplikacji - ponieważ twoja aplikacja ma być niewielka i wysoce skoncentrowana] to wykorzystanie protokołów. Dla naszego przykładu powyżej protokół może wyglądać "Acme-stock-purchase: // client = 123 & stock = XYZ". " - Tylko co to znaczy technicznie, "wykorzystując protokoły"? - Lumi
Problem z tym podejściem polega na tym, że jest to tylko jednokierunkowa komunikacja. - expert


Christophe Nasarre ma blogowane o dość hackowskim sposobie zrobienia tego przy użyciu plików lokalnych. Rezultatem jest komunikacja między aplikacją sklepu komputerowego / aplikacji Windows (określaną jako DA / WSA na blogu) bez konieczności przełączania się między interfejsem dwóch aplikacji. Napisał także o innej, mniej hackowanej technice, obejmującej obsługę protokołów.

Pamiętaj, że posiadanie WSA, który komunikuje się z DA, jest wyraźnie zabronione przez sklep Wymagania certyfikacji aplikacji

Aplikacje Sklepu Windows nie mogą komunikować się z lokalnymi aplikacjami lub usługami lokalnymi za pośrednictwem mechanizmów lokalnych, w tym za pośrednictwem plików i kluczy rejestru.

... ale ogranicza jedynie "mechanizmy lokalne". Sądzę więc, że można zbudować usługę sieciową do routingu komunikacji.


3
2017-10-22 07:31





Jeśli myślisz, że możesz wykonać dodatkową ręczną operację cmd, możesz spróbować :

X:/> CheckNetIsolation.exe LoopbackExempt –a –n=<packageID>;

CheckNetIsolation.exe wchodzi w skład instalacji winRT, więc nie trzeba instalować niczego więcej.

Próbowałem: działa, nawet po aktualizacji pakietu.

Jak pokazano na: http://msdn.microsoft.com/en-us/library/windows/apps/Hh780593.aspx

Poniżej wyjaśniono, jak znaleźć identyfikator pakietu dla twojej aplikacji: http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/82bad7d4-d52b-4731-a396-13ab9004c1cc/how-to-get-the-appid-of-a-meto-style-app-


3
2017-08-02 22:10



Chciałem być w stanie komunikować się z lokalnym hostem dla wewnętrznej aplikacji i mogłem tylko sprawić, żeby stało się to na komputerach nie korzystających z VS przy użyciu tego polecenia. - adosaiguas


Możliwe jest komunikowanie się na tym samym komputerze z aplikacji Metro do aplikacji komputerowej przy użyciu usługi lokalnej. Zaimplementowałem jakiś czas temu prosty "proof of concept", jak ominąć piaskownicę WinRT za pomocą lokalnej usługi. Nadal potrzebuje jakiejś "inżynierii społecznej" lub bezpośredniego przewodnika do instalacji usługi, ale w każdym razie jest to możliwe.
Nie jestem jednak pewien co do zasad certyfikacji dotyczących komunikacji "lokalna usługa" podczas dodawania takiej aplikacji do Windows Store.

Próbka tutaj

Zgodnie z projektem aplikacja Metro nie może uzyskać bezpośredniego dostępu do bazowego komputera, tylko za pomocą interfejsu API WinRT i dostępnych funkcji. Ale kiedy tworzysz usługę zaplecza dla uzyskania dostępu do komputera i wszystkich danych tam, to w zasadzie nie działa już w piaskownicy.

Jedynym "problemem" jest to, że użytkownik musi ręcznie zainstalować tę usługę zaplecza, ale nie będzie to problemem przy użyciu "inżynierii społecznej":    Pobieranie użytkownika "przeglądarka internetowa" Metro app, użytkownik może przeglądać wszystkie zdjęcia, muzykę i filmy, za pomocą WinRT API, ale aplikacja wyświetla również komunikat na dole:    "Pobierz nasz powerpack przeglądarki PC i przeglądaj cały komputer za darmo"

Użytkownik jest przekierowywany na stronę internetową, z której użytkownik może pobrać klasyczny instalator na pulpicie zawierający usługę back-endową "przeglądarka PC" do uzyskiwania dostępu do plików na całym komputerze. Po zainstalowaniu tej usługi stacjonarnej aplikacja Metro może ją wykryć i wykorzystać do przeglądania całego komputera. Użytkownik jest zadowolony, ale piaskownica WinRT jest zagrożona.

Oczywiście nie będzie działać na tabletach z systemem Windows 8 ARM. Wykorzystując to obejście, można nawet zbudować klientów aplikacji Metro dla klasycznych aplikacji komputerowych, takich jak antywirusy, klienci torrent / P2P itp.


2
2017-10-01 17:02



Nie wiesz, dlaczego musisz wspomnieć o inżynierii społecznej ... ponieważ pierwotne pytanie dotyczy aplikacji komputerowej / usługi rozmawiającej z aplikacją metra, oczekuje się, że użytkownik będzie musiał zainstalować osobną aplikację / usługę komputerową. Jakiej metody komunikacji używasz między usługą komputerową a aplikacją metra? - dodgy_coder
Zawsze działa z Win 8.1 64 bity RTM. - MuiBienCarlota


Być może przegapiłem punkt, ale po aktywacji możliwości sieci prywatnej mogę połączyć się z lokalnym działającym serwerem (http) przy użyciu lokalnego adresu IP (nie localhost). Umożliwia to mój scenariusz, w którym aplikacja winrt komunikuje się z aplikacją komputerową wpf


0
2017-10-25 12:18