niedziela, 28 kwietnia 2013

dotnetconf (1)

Ostatnio odbył się event dotnetConf - The .NET Community Virtual Conference. Co ma światowa społeczność .NET do powiedzenia o .NET w 2013 roku?  No właśnie, odnoszę wrażenie, że pod tym szyldem zostało wrzucone wszystko to, co ostatnio zwróciło moją bądź moich kolegów uwagę. Mamy m.in “Roslyn”, responsive design, git, open source, programowanie w JavaScript, ASP.NET MVC, ASP.NET Web API, SPA, Windows Phone 8, MongoDB, NoSQL, obsługę istniejących baz danych w EF, Windows Azure.  Po raz kolejny zniknęły tradycyjne tematy związane z .NET. Najbardziej typowe dla .NET są prezentacje o “Roslyn” (ostatnia oznaka rozwoju samego .NET/C#), ASP.NET Web API i Windows Phone 8, EF, Azure, może jeszcze jedna zahaczająca o ASP.NET MVC (6/17). Co ciekawe zabrakło prezentacji o Windows 8. Czyżby nie przekonał społeczności? Owszem są też bardziej uniwersalne tematy powiązane z .NET, jak debugowanie, testowanie, NoSQL, open source (5/17). Jednak spory udział ma JavaScript i tworzenie aplikacji webowych po stronie przeglądarki (5/17). Zobaczymy co przyniesie BUILD 2013, ale każda kolejna konferencja daje mi znak, że dotychczasowa era intensywnego rozwoju .NET i C# gdzieś się skończyła, coś przeewoluowało, teraz tylko tematy webowe lub mobilne. W każdym razie wybrałem sobie dwunastkę do obejrzenia, na razie obejrzałem dwie, o których pisze pod spodem.

 

Advanced Windows Phone 8 Development

Pakiety nuget

Json.Net – deserializacja JSON

HTTP Client Libraries - HttpClient z obsługą async!  (prerelease)

image

image

Pokaz MVVM, IoC, danych w design time, mowa, trochę agenta. Po tytule spodziewałem super zaawansowanych rzeczy, a tymczasem wszystko okazało się znajome. Jedynie dwa pakiety nuget i kod klienta JSON zwróciły moją większą uwagę. Sporo problemów podczas prezentacji z dźwiękiem, 3 czy 4 razy były przerwy i za każdym razem był pokazywany czuwający Scott Hanselman –;)

 

Utilize Compilation as a Service to create the next level plugin capability

Ponieważ ostatnio używałem najnowszej wersji “Roslyn”, więc prezentacja początkowo nie przykuwała mojej uwagi. Po kilkunastominitowej części robi się znacznie ciekawiej, bo następuje pokaz pisania plug-inu dla Visual Studio.

image

Kwestie bezpieczeństwa przy ładowaniu plug-inów. To co ostatnio akurat widziałem – complify i konsolowa aplikacja REPL. Programowanie aspektowe – Postsharp, Roslyn i refleksja:

image

image

image

W sumie nie jest to coś nadzwyczajnego. Do plug-inu Postsharpa wrzucona dynamiczna kompilacja. Jednak całościowo robi wrażenie.

sobota, 27 kwietnia 2013

Windows 8.1 - kolejne informacje

Dla odmiany pora na kolejną porcję nieoficjalnych informacji o nadchodzącym Windows 8.1 na bazie światowych serwisów: winsupersite, neowin, winbeta, windowsbleu.

Wymienione serwisy w bieżącym miesiącu poświęcają dużo uwagi buildom 9369 i 9374, ostatnio ich uwaga zaczyna się przenosić na 9385 (który podobno jest sygnowany jako “Windows Blue Preview Beta”). Pojawia się też coraz więcej sygnałów, że być może powróci przycisk “Start” oraz pojawi się opcjonalne bootowanie z pomięciem ekranu startowego.    

Dziś postaram się krótko podsumować informacje o buildzie 9374.

Ekran startowy

Szybszy dostęp do wszystkich aplikacji z poziomu ekranu startowego. Przewija się go palcem w dół lub przy myszce pojawia się przycisk ze strzałką. Całość przypomina rozwiązanie z Windows Phone, tylko orientacja jest inna.

9374_02

Więcej informacji

Zarządzanie aplikacjami

Lista wszystkich aplikacji

  • Sortowanie po nazwie, dacie, ostatnio używanych
  • Wyszukiwarka bez kontraktu Search

9374_03

Przy odinstalowywaniu aplikacji opcja dla bieżącej lub wszystkich maszyn. Więcej na In Blue: Multi-PC App Uninstall.

Wyszukiwarka

Wejście w wyszukiwarkę nie przewija już ekranu Start. W domyślnym trybie wyszukiwania w wynikach mogą być uwzględniane dane z różnych aplikacji, w tym z Internetu.

9374_06

Wyszukiwarka działa także w trybie desktop. Więcej na Windows 8.1 9374 shows search charm won't take over screen.

Menadżer plików

W trybie Modern UI jest systemowa aplikacja Files.

9374_08

Tryb kiosku

Kojarzy się trochę z Kid’s Corner z Windows Phone 8. Daje możliwość uruchomienia tylko 1 aplikacji. Jest to otwarcie się na muzea, lotniska, sklepy, restauracje, hotele, biblioteki itd, zwłaszcza aplikacje POS z ekranem dotykowym. Wystarczy utworzyć konto użytkownika z ograniczonymi uprawnieniami i skonfigurować tryb kiosku wybierając konto i aplikację.

Więcej informacji na:

Obsługa urządzeń (WinRT API)

Obsługa urządzeń POS (czytników kodów kreskowych, drukarek paragonów, czytników kart, itp…). Lepsza obsługa VPN, lepsza autentykacja za pomocą SmartCard, rozszerzona obsługa peryferyjnych urządzeń USB, itd. Więcej na Windows 8.1 API reveals extended point-of-service support.

Ustawienia

Sporo nowych zakładek i opcji konfiguracyjnych (pokazano je na filmikach z buildami 9369 i 9374). Pewnym uzupełnieniem są linki:

Warto wspomnieć o rozbudowanych opcjach synchronizacyjnych (ekran startowy - kafelki i ich układ, kolory, tło, tapeta, podobnie lock-screen, desktop - temat, pasek zadań, wysoki kontrast; przeglądarka internetowa - ulubione, strona startowa, historia, zachowane hasła;  system - m.in ustawienia językowe, klawiatury, ułatwień dostępu itd.)

Internet Explorer 11

W katalogu IE w Program Files znajduje się aplikacja F12.exe stylowana na Modern UI.

Na koniec…

Na koniec jedna jeszcze ciekawostka z buildu 9369. Podobno odkryto tam wsparcie dla systemu plików ReFS (znanego z Windows Server 2012). Więcej na Windows 8.1 build 9369 includes ReFS support.

Pamiętajmy, że są to nieoficjalne informacje. Wiążącą odpowiedź da pod koniec czerwca konferencja BUILD.

środa, 24 kwietnia 2013

Dynamiczne aplikacje Web API

ASP.NET Web Forms są powszechnie uważane za nie najnowszą już technologię. Dziś wszyscy sobie na ogół chwalą ASP.NET MVC lub coraz częściej Web API. Czy słusznie? Na ogół tak, dostajemy wszak uporządkowaną warstwową architekturę MVC czy same tylko serwisy Web API. Odkryłem jednak ostatnio, że im nowsza z wymienionych technologii tym mniej w niej dynamicznej kompilacji, co z kolei utrudnia modyfikację aplikacji bez jej ręcznej całościowej rekompilacji. I tak:

  • ASP.NET Web Forms - największy zakres dynamicznej kompilacji (można dużo zaszyć w stronach)
  • ASP.NET MVC - dynamiczną kompilacją objęte widoki (ale modeli  i kontrolerów już to nie dotyczy)
  • ASP.NET Web API - brak w standardzie dynamicznej kompilacji (same modele i kontrolery, domyślnie raz rozpoznana lista kontrolerów jest cachowana)

Czy jednak w nowszych technologiach nie da się uzyskać podobnych efektów? Czy musimy koniecznie żałować dynamicznej kompilacji ASP.NET? M.in na te pytania starałem się odpowiedzieć poszukując możliwości pisania aplikacji Web API w sposób dynamiczny / częściowo dynamiczny. Po praktycznych eksperymentach ukształtowały się następujące pozycje:

  1. Dynamiczne Web API (assembly resolver)
  2. Dynamiczne Web API (“Roslyn” - konsola)
  3. Dynamiczne Web API (“Roslyn” - dynamiczne odświeżanie)
  4. Dynamiczne Web API (“Roslyn” - assembly resolver)
  5. Dynamiczne Web API (scriptcs)

Omówię je teraz po kolei.

Assembly resolver

image

Zacznijmy od standardowych rozwiązań. I tak mamy w Web API interfejs IAssembliesResolver. Jego implementacja służy do określenia listy assemblies, które będą uwzględniane przy szukaniu kontrolerów. Domyślnie uwzględniane są rzeczy z naszego projektu po jego kompilacji, ale możemy to zmienić i załadować w locie dll-kę. Pokazuje to oficjalny Custom Assembly Resolver Sample. W moim wydaniu nieznacznie uległo to modyfikacji, tak by ładować dll-ki ze wskazanego folderu:

image

Tak zdefiniowany assembly resolver rejestrujemy:

Untitled

“Roslyn” (konsola, dynamiczne odświeżanie)

Jeśli rozważamy dynamiczność, to może w większym zakresie, tak by mieć dynamiczną kompilację?  W końcu ASP.NET takie coś oferuje. Z pomocą przychodzi nam przyszłościowy projekt “Roslyn”. Jest to realizacja idei “compilation as service”. Do dyspozycji dostajemy wysokopoziomowe API, które pozwala bardzo szybko w locie kompilować dynamicznie kod. Umożliwia to pisanie i dynamiczne wykonywanie C# w konsoli, co jest typowe dla skryptowych języków.

Podobno są plany, by zastępować kompilatory w językach .NET “Roslynem”. Podobno jest też używany wewnętrznie i został użyty w Web Matrix 2. To technologia wciąż rozwijana. Ostatnie wydanie to Microsoft "Roslyn" September 2012 CTP. Doinstalowuje się ładnie do Visual Studio 2012, także po wszystkich najnowszych aktualizacjach (co sprawdziłem osobiście). To wydanie nie wspiera już VS 2010. Nie możemy rozpowszechniać binariów z tej rozwojowej wersji, ale instalacja pakietu nuget o nazwie roslyn nie podlega już takim ograniczeniom. Dystrybucja przez nuget zawiera wszystkie niezbędne biblioteki do używania, jedynie nie dostaniemy większego wsparcia przez Visual Studio (m.in szablony, kolorowanie składni i intellisense na plikach skryptowych np. C# Script, konsola interaktywna). Warto pamiętać o “Roslyn”, zwłaszcza że na zaczynającej się jutro dotnetconf będzie to temat jednej z sesji.

Jeśli chodzi o Web API, to polecam ostatnio odkryty blog Filipa W. http://www.strathweb.com/. Jeśli chodzi o tematykę Web API + “Roslyn”, to na polecam szczególnie lekturę postów:

image

Na ich podstawie odtworzyłem sobie:

  • skryptową aplikację  hostującą Web API (uruchamianą przez program rcsi lub w Visual Studio przez View > Other Windows > C# Interactive)
  • aplikację Web API hostowaną na IIS, która buduje dynamiczne assembly ze skryptów z kontrolerami i modelami (co odbywa się w specjalnej implementacji selektora kontrolerów za każdym odświeżeniem strony lub wywołaniem z przeglądarki)

Zatrzymajmy się na chwilę przy pełnym rozwiązaniu z dynamicznym odświeżaniem kontrolerów przy każdym strzale. Umożliwia to klasa NoCacheSelector, która u mnie ma zparametryzowane ścieżki do folderów ze skryptami:

image

Powyższy selektor kontrolerów rejestrujemy:

Untitled2

Skrypty kompilowane w locie:

image   image

Dostajemy największą elastyczność. Bez rekompilacji całego projektu przy każdej interakacji dostajemy kontrolery odpowiadające aktualnie znajdującym się plikom C# w folderach Controllers (z modelami z plików C# w Models). Jak pisze jednak autor, to eksperyment z pewnym ryzykiem. Przy każdym strzale zostaje dodawane nowe assembly do domeny i pozostaje jedynie liczyć na wymuszone sprzątanie przez garbage collector.

“Roslyn” - assembly resolver

Tą wersję wymyśliłem jako miks koncepcji dotychczas zaprezentowanych. Rezygnuję z ciągłego odświeżania kontrolerów (ale także ich rekompilacji) przy każdym strzale, a w resolverze assemblies zamiast szukania i ładowania statycznych dll-ek z dysku buduję dynamiczne assembly ze skryptów z kontrolerami i modelami.

image

scriptcs

Projekt scriptcs to ostatnio bardzo medialne pojęcie. Glenn Block po swoich doświadczeniach z node.js w Windows Azure postanowił zrobić coś podobnego w… C#. Powstał projekt open source, który pozwala pisać skryptowo aplikacje w C#, taki znacznie lepszy PowerShell. Piszemy tyle C# ile potrzebujemy, odpowiednie biblioteki są dociągane przez nuget, a całość jest dynamicznie kompilowana przez “Roslyn”. Wystarczy notatnik, nie jest potrzebne Visual Studio. Do projektu jako jeden z trzech głównych osób dokoptował Filip W. który wniósł swoje wcześniejsze doświadczenia z Web API i “Roslyn”.

Kilka linków:

Warto być świadomym obecności:

Na początek wziąłem przykład webapihost.

image

Po zainstalowaniu/zbudowaniu aplikacji konsolowej scriptcs.exe, dodaniu jej do ścieżki path w systemie, możemy uruchomić przykład. Zostaną pobrane wymagane pakiety i zapisane do folderu packages. Do folderu bin trafiają używane biblioteki. Dostajemy w pełni skryptową aplikację Web API w C# hostowaną w konsoli. Czyż nie jest to wyrażenie idei “node.cs” ?

Jeszcze prościej możemy to osiagnąć za pomocą scriptcs-webapi. Całość aplikacji może wyrażać jeden plik:

image

W tym przypadku widać jeszcze większe podobieństwo do node.js. Po co definiować za każdym razem routing? Czyż nie wystarczająco i bardziej minimalistycznie jest definiować same kontrolery, które wyrażają także w jakiś sposób adres? Bawiąc się node.js miałem właśnie skojarzenie, że wystawiane metody REST-owe to jakby akcje kontrolerów… A cała prostota wynika z odpowiedniego zaprojektowania pakietu express.

Na tym kończę przegląd dynamicznych rozwiązań dla Web API. Dodam tylko, że w tym temacie miałem jeszcze zajawki odnośnie:

  • wykorzystania MEF w Web API
  • integracji ASP.NET z Web API

W przypadku MEF dla .NET 4.5 mamy obecnie jego drugą lekką wersję w postaci  MEF for web and Windows Store apps. Owszem można znaleźć w sieci wiele przykładów łączenia Web API z różnymi wersjami MEF, jednak często dotyczą one wpięcia w infrastrukturę dla IoC. Często wydają się też dość skomplikowane (np. http://kennytordeur.blogspot.com/2012/08/mef-in-aspnet-mvc-4-and-webapi.html). Dużo informacji dostarcza też wątek http://mef.codeplex.com/discussions/389317.

Jak patrzyłem po sieci, to niektórzy próbowali definiować kompozycję na folderze, ale nie wiem czy komuś udało się osiągnąć wykrywanie w czasie run-time nowych kontrolerów, bo są one domyślnie cachowane przez Web API. Może za mało wszedłem w temat, ale wydaje mi się, że również MEF musiałby robić rekompozycję przy każdym strzale, co z pewnością byłoby nie najszybsze (lub trzeba by pomyśleć o wykrywaniu zmian). Z kolei samo jednokrotnie zaczytanie dll-ek w sposób dynamiczny mogę zrealizować w całości w oparciu o infrastrukturę Web API, jak pokazałem w pierwszym przykładzie.

Co do integracji z ASP.NET, to zainspirował mnie oficjalny przykład Web Form Sample oraz post. Jednak po przeczytaniu posta architekta ASP.NET, widać jak na dłoni, że standardowa dynamiczna kompilacja ASP.NET/Razora jest znacznie gorsza od kompilacji wykonywanej za pomocą “Roslyn” (jest znacznie wolniesza, bo korzysta z emitowania i potrzebuje innego procesu). Nawet powstał projekt https://github.com/davidebbo/RoslynRazorViewEngine zaprzęgający “Roslyn” do kompilacji Razora, co znacząco zwiększa wydajność.

środa, 17 kwietnia 2013

Node.js + IIS

Konsola jest niezłym urozmaiceniem w czasach, w których przyzwyczailiśmy się, że wszystko ma graficzny interfejs. Jednak w codziennym użytkowaniu wygodniej jest, jeśli nasz serwer jest uruchamiany w postaci usługi. Ten post poświęcę kwestii hostowania node.js na platformie Windows ze szczególnym uwzględnieniem integracji z IIS.

Mamy różne sposoby uruchamiania aplikacji node.js w postaci usługi Windows:

Niewątpliwie bardzo interesującą opcją - choć dla niektórych trochę kontrowersyjną - jest hostowanie node.js na serwerze IIS. Służy temu projekt iisnode, który jest również dzieckiem Tomasza Janczuka. Na jego blogu można znaleźć wiele postów poświęconych temu zagadnieniu. Tutaj dokonam tylko krótkiego podsumowania najbardziej istotnych informacji:

iisnode

Instalacja

Nie sprawiła żadnego problemu. Wcześniej doinstalowałem moduł IIS do przepisywania adresów URL. Instalacja przykładów wg. wskazówek również bezproblemowa. Node.js wspierany w wersji 0.8.22 x86, co jest zgodne z projektem edge.js i sterownikiem do MS SQL Server. Aha, na systemach x64 w ustawieniach puli ASP.NET dla aplikacji node.js nie zezwalamy na uruchamianie aplikacji 32-bitowych (domyślnie tak właśnie jest, ale jak ktoś ma to włączone to niech wyłączy lub stworzy dedykowaną pulę).

Zmiany

Tutaj po krótce, co zmieniałem w przykładzie prezentowanym we wcześniejszych postach.

sn11

Port

W pliku server.ts (server.js) zmieniałem port na zmienną środowiskową process.env.PORT.

Konfiguracja

Zgodnie z zaleceniami do katalogu z aplikacją node.js dodałem plik Web.config

image

W handlerach informuję IIS by plik server.js nie traktował w sposób domyślny jako statyczną zawartość dla przeglądarki, tylko jego obsługę przekazał modułowi iisnode. To podstawa wszystkiego. W opcjonalnej sekcji <rewrite> konfiguruję adresy dla aplikacji, by nie zawierały słowa “server.js”. O adresach więcej w następnej sekcji.

Adresy

Po umieszczeniu aplikacji w folderze nodejs-app na IIS, zmieniłem w niej adresy endpointów tzn. np “/api/products” na “/nodejs-app/api/products”. Podobną praktykę zaobserwowałem w dostarczonych przykładach. Umieszczanie nazwy folderu IIS w kodzie aplikacji nie wydaje mi się najlepsze, ale to tylko demo. Z pewnością da się to zrobić lepiej…

Uprawnienia

Po zhostowaniu aplikacji w IIS przestał mi działać dostęp do SQL Server’a i do COM-a Outlook. Przykładowo w przypadku SQL trzeba było dodać do jego loginów konto ‘IIS APPPOOL\DefaultAppPool’. Czyli rzeczy znane z codziennej pracy pod IIS –;)

Podsumowanie

Niektóre funkcjonalności i moduły node.js częściowo dublują IIS. Ze względów wydajnościowych z reguły lepiej używać natywnych mechanizmów.  IIS czasem wprowadza ograniczenia, coś narzuca. W każdym razie w zestawieniu IIS + node.js chodzi o udaną symbiozę, tak by wziąć to, co najlepsze z obu serwerów. Node.js daje łatwe pisanie serwera w JavaScript i zakłada asynchroniczność każdej operacji przy jednym wątku (asynchroniczne handlery w ASP.NET były od zawsze możliwe do pisania, ale dopiero ostatnio się popularyzują z uwagi na znaczne uproszczenia wprowadzone przez TPL i async). IIS dodaje m.in mechanizmy bezpieczeństwa, dzielenie portów, kompresję, cachowanie, szybkie udostępnianie statycznej zawartości.

I jeszcze jedno. Konfiguracja node.js + IIS jest używana przez:

image

wtorek, 16 kwietnia 2013

Node.js + Microsoft SQL Server (2)

Kontynuacja poprzedniego tematu, czyli Sql Server na node.js. Dziś poruszę kwestię obsługę procedur z parametrami output.

Jak wskazuje jeden z linków z poprzedniego posta, w aktualnej wersji drivera dla Microsoft SQL Server nie ma specjalnego wsparcia dla obsługi tej funkcjonalności (podobnie jak nazwanych parametrów). Jest propozycja, by zostało to zaimplementowane w postaci zwracania wielu rezultatów z procedury (wartości parametrów out jako pseudo-rezultaty).

No dobra, ale jak sobie poradzić teraz z tym? Driver Microsoft wydaje się najpewniejszym sposobem dostępu do Sql Server. Owszem można spotkać inne pakiety node.js, ale nie rzuciło mi się na oczy nic szczególnego, zwłaszcza z takim ficzerem. Zawsze mogę też użyć .NET dzięki edge.js… Ale istnieje też rozwiązanie problemu w samym T-SQL. Tymczasowo możemy opakować wywołanie procedury z parametrami out, tak by zasymulować zwracanie wielu wyników. Robimy to albo w postaci innej procedury lub w postaci ciągu instrukcji T-SQL przekazywanych wprost do obecnej wersji drivera!  W poniższym przykładzie skorzystałem z tej drugiej opcji.

Capture2_thumb5

sn9

Podobnie jak w poprzednim poście z metadanych i danych w wierszach buduję obiekty z właściwościami. Otrzymuję w przeglądarce dynamicznie wyniki w postaci JSON:

image

Uzyskałem wynik podobny to tego, jaki dostanę po zastosowaniu przyszłej wersji pakietu node.js dla MS SQL Server –;) 

poniedziałek, 15 kwietnia 2013

Node.js + Microsoft SQL Server (1)

Tym razem podsumuję sposoby dostępu do bazy Microsoft Sql Server z poziomu node.js.

Mamy ogólnie dwie wygodne opcje:

Jako że już sporo pisałem o Edge.js, dziś skupię się na dedykowanym pakiecie. Na początek kilka faktów:

Spróbujmy z node.js wywołać procedurę składowaną. Aby było ciekawiej weźmy taką, która zwraca dwa zbiory wyników. Odpowiedni kod w TypeScript/JavaScript wygląda następująco:

Capture2Capture

W przypadku wielu wyników callback w wywołaniu queryRaw jest wywoływany tyle razy, ile jest wyników (w moim przypadku dwa razy). Aby obsługa wielu rezultatów działała, używamy wywołania queryRaw z parametrem more. Bez niego zostanie zwrócony tylko pierwszy rezultat procedury. Wywołanie bez more zwykle stosujemy przy procedurach zwracających jeden wynik.

Kod z pętlami ma za zadanie zmienić strukturę zwracanych danych, tak by zamiast wszystkich metadanych kolumn i wierszy zwracać obiekty z odpowiednimi właściwościami. Zwracany do przeglądarki JSON wygląda w moim przypadku następująco:

image

Zmiana lub podmiana procedury w bazie powoduje zwracanie danych o innej strukturze bez żadnej modyfikacji kodu serwera. Pełna dynamiczność przy krótszym i prostszym kodzie niż C#. Do more with less!

sobota, 13 kwietnia 2013

Node.js + kod natywny

Dziś chciałbym poruszyć zagadnienie integracji node.js z kodem natywnym na platformie Windows.

Na stronie http://nodejs.org/api/addons.html znajdziemy opis tworzenia własnych rozszerzeń dla node.js w oparciu o kod C/C++. Nie jest to z pewnością łatwy proces. Wśród różnych czynności powstaje kompilowany plik *.node z bindingami. Taki właśnie zaobserwowałem w pakiecie drivera do Microsoft SQL Server.

Częściej jednak po prostu chcemy wywołać istniejącą już niezarządzaną bibliotekę .dll lub obiekt COM. Poniżej spisałem, co udało mi się ustalić.

Dynamiczne biblioteki C/C++ (.dll)

COM

A teraz pora na krótką relację z tego co udało się odpalić “na żywo”.

sn6

Pobieranie infomacji o systemie

Załóżmy, że ktoś nagle zapragnął, by aplikacja node.js wyświetlała informacje na jakiej wersji Windows jest hostowana. Kierując się czasem i wygodą możemy użyć .NET i znanego od dawna kawałka C#. W tym konkretnym przykładzie wygląda on następująco:

image

Najprostszy typowy kod integrujący:

image

Wywołanie JavaScript:

image

W przeglądarce mam ładnego JSON-a:

image

Wyświetlanie maili z Outlooka

Załóżmy większy odlot w postaci udostępnienia dla node.js maili ze skrzynki Inbox z aplikacji Microsoft Outlook. Co prawda to z pewnością rzadki scenariusz, ale chodziło mi o wywołanie COM-a. Pobieranie maili realizuję znanym od dość dawna kawałkiem kodu w C# (nawet nie używam dynamic):

image

Kod integrujący i wywołanie z poziomu JavaScript są zrobione tak jak w pierwszym przykładzie. W przeglądarce dostaję maile:

sn8

BTW Powyższy kod samej integracji z Outlook nie jest do końca niezawodny (kwestia otworzonych instancji), ale tak samo zachowuje się poza node.js. Chodziło mi tutaj tylko o najprostsze demo.

Inaczej?

Integrację zrealizowałem dla wygody przez .NET. Jeśli chcemy wołać natywny kod bezpośrednio z JavaScript, możemy użyć pakietów node-ffi i win32ole. Umożliwiają one odpowiednio - wywoływanie natywnych bibliotek DLL oraz obiektów OLE (jest nawet podobny przykład z mailami Outlook’a). IMHO można spróbować z nich skorzystać, gdy będziemy chcieli wywołać kompletną funkcjonalność z kodu natywnego (tzn. nie będziemy chcieli skorzystać z niej w połączeniu z kodem .NET). Pakiety te wydają mi się też bardziej eksperymentalną opcją –;)