fbpx
devstyle.pl - Blog dla każdego programisty
devstyle.pl - Blog dla każdego programisty
2 minut

Wstrzykiwanie informacji do HTML w Nancy


07.10.2013

Wpadłem na pomysł rozwiązania pewnego dręczącego mnie problemu (o którym pewnie wkrótce) w aplikacji webowej. Pomysł ten polega na wstrzyknięciu informacji o aktualnym użytkowniku w postaci JSON do HTMLa zwracanego do przeglądarki. Ot, po prostu żeby strona kliencka wiedziała z kim ma do czynienia.

Aplikacja ta powstaje w Nancy – bardzo eleganckim frameworku, o którym chyba kiedyś wspomniałem, ale też którego nigdy w technicznym poście nie poruszyłem.

W Nancy rozwiązanie problemu jest całkiem proste. Cała konfiguracja aplikacji znajduje się w klasie Bootstraper. Nancy dostarcza nam kilka standardowych bootstraperów, a żeby osiągnąć pożądaną funkcjonalność – wystarczy nadpisać “najbardziej standardowy” z nich, czyli DefaultNancyBootstrapper.

O tak:

public class CustomBootstrapper : DefaultNancyBootstrapper
{
    protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
    {
        pipelines.AfterRequest.AddItemToEndOfPipeline(new PipelineItem<Action<NancyContext>>(
            "Injecting user info into a non-ajax, authenticated response",
            ctx =>
            {
                if (ctx.CurrentUser == null || ctx.IsAjaxRequest())
                {
                    return;
                }

                var str = new MemoryStream();
                ctx.Response.Contents.Invoke(str);
                string originalOutput = Encoding.UTF8.GetString(str.GetBuffer());

                int endOfBody = originalOutput.LastIndexOf("</body>");
                if (endOfBody > 0)
                {
                    var userInfo = ctx.CurrentUser.DumpClientSideInfo();
                    string json = new JavaScriptSerializer().Serialize(userInfo);

                    ctx.Response.Contents = s =>
                    {
                        string modifiedOutput = originalOutput.Insert(endOfBody, @"<script>
var currentUser = ({0})
</script>".FormatWith(json));

                        var writer = new StreamWriter(s, Encoding.UTF8) {AutoFlush = true};
                        writer.Write(modifiedOutput);
                    };
                }
            }));
    }
}

Da się to rozwiązać jakoś bardziej elegancko, obiektowo, i w ogóle, ale…

0 0 votes
Article Rating
7 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
siararadek
siararadek
10 years ago

Ja podobną rzecz napisałem do MVC żeby wstrzykiwać dane do Angulara. Sporo o Nancy słyszę i chyba następny mój projekt w tym powstanie :)

trackback
10 years ago

Wstrzykiwanie informacji do HTML w Nancy | Maciej Aniserowicz o programowaniu…

Dziękujemy za dodanie artykułu – Trackback z dotnetomaniak.pl…

Scooletz
10 years ago

Hej,
zmieniłbym dwie rzeczy: pierwsza to serializator (JSON.NET is good). Druga to to, że aby dokleić na koniec fragment tekstu, cała odpowiedź jest wczytywana do pamięci, potem LastIndexOf… trochę to cięzkie. Zastanawiałeś się nad sekcją i dorzuceniem tego w Layoutcie (Razor)?

Bartek
Bartek
10 years ago

Jako niedoświadczony w aplikacjach webpowych zastanawiam się nad wykorzystaniem tego pomysłu i tak na szybko przyszło mi na myśl dostosowywanie aplikacji web po stronie klienta w zależności od użytkownika, np. z wykorzystaniem KnockoutJS lub Angulara. Mam rację?

Łukasz
10 years ago

ogólnie takie wstrzykiwanie informacji do html’a jest bardzo wartościowe! np. bootstrapData w google docs. często widzę aplikacje, które na onload zaczynają bombardować serwer po jakieś informacje. a zwykle można je “wkleić” do htmla.

Kurs Gita

Zaawansowany frontend

Szkolenie z Testów

Szkolenie z baz danych

Książka

Zobacz również