NancyFX

Nancy – zasłanianie się danych podczas bindowania z POST

Posted on Updated on

Mamy następujący kawałek kodu. Nancy – moduł REST który coś tam robi.

public class TopicsModule : NancyModule
{
    public class Note
    {
        public int Id { get; set; }
        public string Content { get; set; }
    }

    public TopicsModule()
        : base("/api/topics")
    {
        Post["/{id:int}"] = parameters =>
        {
            var id = (int)parameters.id.Value;

            Note note = this.Bind<Note>();
            // note.Id == ?
          
            // ...
        }
    }
}

Wywołujemy request typu POST pod adres http://localhost/api/topics/11 z następującym body:

{ 
  id: 44, 
  content: 'nowy tekst'
}

Teraz pytanie – Jaka będzie wartość note.Id?

Spodziewałem się wartości 44 i trochę się namęczyłem szukając dlaczego nie jest to 44.
Mechanizm bindowania działa tak, że najpierw brane są wartości z URLa, później z Query stringa, a dopiero na końcu z body requestu. W powyższym przypadku note.Id wynosić więc będzie 11.

Musimy więc w kodzie zapewnić aby nie było kolizji tych nazw, np:

public class TopicsModule : NancyModule
{
    public class Note
    {
        public int Id { get; set; }
        public string Content { get; set; }
    }

    public TopicsModule()
        : base("/api/topics")
    {
        Post["/{topicId:int}"] = parameters =>
        {
            var topicId = (int)parameters.topicId.Value;

            Note note = this.Bind<Note>();
            // note.Id == 44
          
            // ...
        }
    }
}
Advertisements

Ścieżki bezwzględne w Nancy zamiast HttpContext.Current.Server.MapPath()

Posted on

Dzisiejszy bohater – IRootPathProvider.GetRootPath().

Zamiast

public HomeModule()
{
    string filePath = HttpContext.Current.Server.MapPath("/Pdf/VERDANA.ttf");
    // ...
}

Używam

public HomeModule(IRootPathProvider pathProvider)
{
    string filePath = Path.Combine(pathProvider.GetRootPath(), "Pdf/VERDANA.ttf");
    // ...
}

Po prostu lubię się pozbywać zależności od HttpContext.Current

Źródło: Nancy – The root path

Nancy nie pokazuje plików z katalogu /Scripts

Posted on

Domyślna konfiguracja Nancy zwrócić 404 po próbie “localhost://Scripts/angular.js” (mimo, że plik tam jest).

Każdy framework ma jakieś reguły które pliki pokazywać a których nie (ASP.MVC nie pokaże nam pliku home.cshtml) i ma to sens.

W Nancy jest to też dobrze wyjaśnione Managing Static Content. Mały problem jest że na górze tej strony jest

TL;DR: stick stuff in /Content .. done.

Zrobiłem tak w jednym/drugim projekcie bo były proste, niestety zrobiłem też tak w kolejnym, który już nie był prosty. Problem pojawi się zawsze gdy dociąga się biblioteki Nugetem. Wtedy wszystkie JavaScripty lądaja właśnie w /Scripts, analogicznie style w /Styles itd. Lepiej tych plików stąd nie ruszać, ze względu na przyszłe aktualizacje tych bibliotek.

Na Managing Static Content trzeba poczytać dużo niżej aby poczytać jak włączyć pokazywanie plików ze /Scripts:

public class Bootstrapper : DefaultNancyBootstrapper
{
    protected override void ConfigureConventions(NancyConventions conventions)
    {
        base.ConfigureConventions(conventions);

        conventions.StaticContentsConventions.Add(
            StaticContentConventionBuilder.AddDirectory("/Scripts", "/Scripts")
        );
    }
}