IFormFile to byte array

Dziś kod ułatwiający pracę w ASP.NET Core WebAPI.Poniżej metoda rozszerzająca, która pozwala pobrać zawartość pliku przekazanego w żądaniu: public static class FormFileExtensions { /// <summary> /// Returns file content as byte array. /// Returns null if null input provided. /// </summary> /// <param name="pgmFile"></param> /// <returns></returns> public static byte[] ExtractFileContent(this IFormFile pgmFile) { byte[] pgmFileContent = null; if (pgmFile?.Length > 0) { ...
Read More

Quick tip na HTTP 403

Zdarza się, że podczas wykonywania żądania GET z poziomu kodu otrzymujemy odpowiedź 403 Forbidden, mimo że podobna operacja z poziomu przeglądarki lub Postmana działa bez zarzutu.Winny może być brak nagłówka User-Agent. WebClient wb = new WebClient(); wb.Headers.Add("User-Agent: Other"); wb.DownloadFile(url, fileName); Teraz działa bez zarzutu :) ...
Read More

Scalanie pliku EXE z bibliotekami DLL

Większość tworzonych przez nas aplikacji .NET jest oparta o zewnętrzne biblioteki. W wyniku ich kompilacji programu otrzymamy: program EXE lub bibliotekępliki DLL bibliotek zależnychdokumentację powyższych w formie *.XMLplik symboli PDFkonfigurację programu w formie *.CONFIG Poniżej przykład aplikacji konsolowej, która korzysta z bibliotek oferujących funkcje kontenera DI oraz serializatora JSON. W wyniku kompilacji powstało aż 7 plików. Pokażę, jak w łatwy sposób zminimalizować wynik do dwóch plików. Na początek należy dołączyć do naszego programu pakiet NuGet o nazwie Costura.Fody https://github.com/Fody/Costura Od teraz każda kompilacja programu spowoduje, że biblioteki zależne zostaną dołączone do niego jako zasoby. Po kolejnej budowie solucji pozostało tylko 5 plików. Bardziej dociekliwi mogą zauważyć, że rozmiar pliku wynikowego EXE jest dużo mniejszy niż łączny rozmiar plików DLL na poprzednim zdjęciu. Powodem jest automatyczna kompresja zasobów podczas procesu scalania plików przez Fody. Aby zapobiec tworzeniu pliku PDB, należy zmienić ustawienia projektu.W zakładce Build klikamy przycisk Advanced..., w kolejnym oknie zmieniamy dla opcji Debugging information z Full na None i zapisujemy zmiany. Aby...
Read More

FluentValidation – Cannot pass null model to Validate

FluentValidation to znakomita biblioteka ułatwiająca walidację danych. Pozwala zdefiniować reguły walidacji w całkiem zgrabny sposób. Dla podstawowych scenariuszy zawiera gotowe komunikaty błędu w wielu wersjach językowych. Niestety posiada też pewną kuriozalną cechę.Jeśli do metody Validate zostanie przekazana wartość null, zostanie rzucony wyjątek z informacją "Cannot pass null model to Validate". Co na ten temat mówi autor biblioteki? "This is actually by design. The purpose of FluentValidation is to validate properties on objects, which by definition requires a non-null instance in order to work."https://github.com/JeremySkinner/FluentValidation/issues/486#issuecomment-307696164 Czyli jak to często w świecie IT bywa: "It's Not a Bug, It's a Feature." Bywają jednak sytuacje, że null jest wartością spodziewaną i chcemy zwrócić błąd walidacji spójny z pozostałymi regułami. Można to zrobić nadpisując metodę Validate walidatora: public class Product { public string Title { get; set; } public decimal Price { get; set; } ...
Read More

ViewModel i INotifyPropertyChanged

O interfejsie INotifyPropertyChanged słyszał każdy, gdy napotkał wzorzec MVVM. Niestety podstawowy sposób tworzenia właściwości w klasie ViewModel jest zbyt czasochłonny. Zacznijmy od przykładu: public class BasicViewModel : INotifyPropertyChanged { private string customerName; public event PropertyChangedEventHandler PropertyChanged; public string CustomerName { get { return customerName; } set { ...
Read More