W przypadku, gdy zaistnieje potrzeba wykorzystania kryptografii, tj. zakodowania pewnych danych w aplikacji (z możliwością ich późniejszego odszyfrowania), powinno się unikać korzystania ze standardowych algorytmów szyfrujących dostępnych w .NET 2.0, ponieważ nie zapewniają one wystarczającego bezpieczeństwa. W miarę bezpieczny, wydaje się algorytm AES, jednak jak to w kryptografii bywa, skuteczna użyteczność poszczególnych algorytmów z biegiem czasu maleje.
Link, do działającego algorytmu w C#, można znaleźć na stackoverflow.com.
Osobiście miałem okazję z niego korzystać w momencie, gdy jedynym skutecznym sposobem przekazania danych identyfikacyjnych z głównego okna aplikacji do popupa było wysłanie danych za pomocą querystringa (klient zażyczył sobie przeniesienie wszystkich plików typu BLOB z naszej bazy danych, do zewnętrznego syst. plików obsługiwanego przez firmę zewnętrzną z możliwością obsługi załączników do wniosku przez aplikacje trzecie).
Inne przydatne linki:
stackoverflow.com - how-to-start-learn-cryptography-with-c-sharp
http://stackoverflow.com - c-sharp-rsa-encryption-decryption-with-transmission
poniedziałek, 30 września 2013
czwartek, 26 września 2013
Datatable to CSV (Excel)
Ost. zostałem poproszony o pomoc w pewnej sprawie. Sprawa dotyczyła... problemu z zapisem, a nast. odczytaniem dokumentu CSV na dysku. No cóż. Nie pozostało mi nic innego, jak zamienić FileStream na MemoryStream, a nast. przekazać go do obiektu klasy Attachment (pomijając zbędne zapisywanie załącznika na dysku). Przy okazji poprawiłem też metodę tworzenia samego załącznika (zapytanie SQL zwracało DataTable, który nast. był konwertowany na CSV). Całkiem sprytne i zgrabne rozwiązanie znalazłem na stackoverflow.com (convert-datatable-to-csv-stream).
Dlaczego więc piszę tutaj o tym? Ponieważ, w rozwiązaniu, które jest na stackoverflow, dokonałem kilku kosmetycznych zmian i postanowiłem je sobie tutaj zachować na przyszłość.
W klasie wywołującej kodowanie: "Windows-1250"
W klasie Extensions, w metodzie ToCSV znak oddzielający: ";"
Dlaczego więc piszę tutaj o tym? Ponieważ, w rozwiązaniu, które jest na stackoverflow, dokonałem kilku kosmetycznych zmian i postanowiłem je sobie tutaj zachować na przyszłość.
W klasie wywołującej kodowanie: "Windows-1250"
W klasie Extensions, w metodzie ToCSV znak oddzielający: ";"
środa, 25 września 2013
Konfiguracja IIS do hostowania aplikacji wykorzystującej SSL
Zgodnie z zapowiedzią, zaprezentowaną jakiś czas temu tutaj na blogu, po blisko 2 latach postanowiłem porzucić sharepointa i skoncentrować się na programowaniu w .NET. Jednym z zadań, jakie zostało mi postawionych, było stworzenie aplikacji webowej\web service, który jako swój element składowy będzie wykorzystywał inny web service zabezpieczony certyfikatem SSL.
Przystąpiłem więc do pracy. Pierwszą rzeczą, którą zrobiłem, to zainstalowałem certyfikat na komputerze (dwuklik na certyfikacie, a nast. 'next->next->wpisz hasło -> next->itd.').
Następnie stworzyłem aplikację webową, która wykorzystywała ten web service i wyświetlała odpowiednie dane na stronie .aspx. Pocz. visual studio nie chciało się u mnie podłączyć do web service (zapewne kwestia servera proxy w korpo), bo z 'iPlusa' wszystko chodziło tak jak należy.
Sposobem, aby zaczęło mi to działać w sieci korporacyjnej, okazało się włączenie programu Fiddler. Początkowo planowałem go użyć do zdiagnozowania problemu, natomiast... samo jego wykorzystanie rozwiązało mój problem na maszynie developerskiej (zapewne wynika to z faktu, że Fiddler w domyślnych ustawieniach wymusza autentykację).
Ok, aplikacja na maszynie developerskiej to jedno. Jeszcze trzeba to postawić na IIS, aby inni ludzie mieli do tego dostęp. O ile stworzenie puli aplikacji i wgranie tam strony było proste, o tyle sprawienie, aby nasza aplikacja mogą bez problemów wykorzystywać zewnętrzny web service z SSL przysporzyło mi nieco pracy (Error 403).
Rozwiązanie polega na tym, że należy stworzyć własny certyfikat i ustawić w ISS 'powiązania' (ang. 'bindings'). Jak to zrobić można przeczytać tutaj oraz tutaj (2 art. do czytania)
oraz upewnić się w ustawieniach puli aplikacji, że aplikacja będzie uruchamiana z konkretną tożsamością użytkownika (ponieważ ta konkretna aplikacja nie posiadała swojego typu 'logowania', to jest personifikowana jako konto admina w puli aplikacji).
Przystąpiłem więc do pracy. Pierwszą rzeczą, którą zrobiłem, to zainstalowałem certyfikat na komputerze (dwuklik na certyfikacie, a nast. 'next->next->wpisz hasło -> next->itd.').
Następnie stworzyłem aplikację webową, która wykorzystywała ten web service i wyświetlała odpowiednie dane na stronie .aspx. Pocz. visual studio nie chciało się u mnie podłączyć do web service (zapewne kwestia servera proxy w korpo), bo z 'iPlusa' wszystko chodziło tak jak należy.
Sposobem, aby zaczęło mi to działać w sieci korporacyjnej, okazało się włączenie programu Fiddler. Początkowo planowałem go użyć do zdiagnozowania problemu, natomiast... samo jego wykorzystanie rozwiązało mój problem na maszynie developerskiej (zapewne wynika to z faktu, że Fiddler w domyślnych ustawieniach wymusza autentykację).
Ok, aplikacja na maszynie developerskiej to jedno. Jeszcze trzeba to postawić na IIS, aby inni ludzie mieli do tego dostęp. O ile stworzenie puli aplikacji i wgranie tam strony było proste, o tyle sprawienie, aby nasza aplikacja mogą bez problemów wykorzystywać zewnętrzny web service z SSL przysporzyło mi nieco pracy (Error 403).
Rozwiązanie polega na tym, że należy stworzyć własny certyfikat i ustawić w ISS 'powiązania' (ang. 'bindings'). Jak to zrobić można przeczytać tutaj oraz tutaj (2 art. do czytania)
oraz upewnić się w ustawieniach puli aplikacji, że aplikacja będzie uruchamiana z konkretną tożsamością użytkownika (ponieważ ta konkretna aplikacja nie posiadała swojego typu 'logowania', to jest personifikowana jako konto admina w puli aplikacji).
wtorek, 30 lipca 2013
Entity Framework Modified State (updating row values)
Pogłębiając moją wiedzę nt. Entity Framework zauważyłem pewną ciekawą właściwość, mianowicie w syt. gdy tylko niektóre kolumny w wierszu z danymi zostały zaktualizowane, to Entity Framework zachowuje się w różny sposób dla różnego rodzaju aplikacji:
- dla aplikacji okienkowych (windows forms) aktualizuje tylko wybrane kolumny danego rekordu
- dla aplikacji webowych (asp) aktualizuje wszystkie kolumny danego rekordu
- dla aplikacji okienkowych (windows forms) aktualizuje tylko wybrane kolumny danego rekordu
- dla aplikacji webowych (asp) aktualizuje wszystkie kolumny danego rekordu
źródło
In a desktop application, state changes are typically set automatically. In this type of application, you read an entity and make changes to some of its property values. This causes its entity state to automatically be changed toModified. Then when you callSaveChanges, the Entity Framework generates a SQLUPDATEstatement that updates only the actual properties that you changed.
However, in a web application this sequence is interrupted, because the database context instance that reads an entity is disposed after a page is rendered. When theHttpPostEditaction method is called, this is the result of a new request and you have a new instance of the context, so you have to manually set the entity state toModified.Then when you callSaveChanges, the Entity Framework updates all columns of the database row, because the context has no way to know which properties you changed.
If you want the SQLUpdatestatement to update only the fields that the user actually changed, you can save the original values in some way (such as hidden fields) so that they are available when theHttpPostEditmethod is called. Then you can create aStudententity using the original values, call theAttachmethod with that original version of the entity, update the entity's values to the new values, and then callSaveChanges.For more information, see Add/Attach and Entity States and Local Data on the Entity Framework team blog.
niedziela, 28 lipca 2013
Log in as a different user in sharepoint 2013
Ten konkretny wpis, to zwykły link do innego bloga, ale zostawiam to tutaj, ponieważ ten blog jest również moim prywatnym notatnikiem.
heblobfarm.wordpress.com <-> sharepoint-2013-ui-log-in-as-a-different-user/
heblobfarm.wordpress.com <-> sharepoint-2013-ui-log-in-as-a-different-user/
Layouts folder location in sharepoint 2010/2013
No i stało. Oficjalnie wyszedł długo oczekiwany następca sharepointa 2010, czyli sharepoint 2013. Zapewne posiada wiele ciekawych funkcji i udogodnień, natomiast pierwszą rzeczą, która rzuca się w oczy, to fakt, że projekty napisane w sharepoint 2010, które planujemy wdrożyć dla sharepointa 2013 powinny być skonwertowane na typ projektu 'sharepoint 2013'. Projekt po takiej konwersji nie może zostać użyty w 'sharepoint 2010'. W praktyce jesteśmy więc zmuszeni do stworzenia dwóch projektów obok siebie i wymuszenia, aby oba projekty posiadały wspólne pliki .cs (niestety, ale inne pliki, czyli aspx, ascx, css, js, xml, png, i cała reszta plików umieszczana zazwyczaj w 'layouts' musi być zdublowana i znajdować się w obu projektach).
Gdyby jednak tego było mało, to folder layouts w nowym sharepoincie nie nazywa się 'layouts/' (tak jak to było w sharepoint 2010), tylko... 'layouts/15/".
Na szczęście jest sposób, aby można było wykorzystywać te same pliki .cs w obu projektach. Oto on, czyli klasa UrlHelper:
W praktyce, wszędzie, gdzie odwołujemy się do katalogów związanych z 'layouts', zamiast wpisywać stringi, powinniśmy wykorzystać metodę klasy UrlHelper.
Gdyby jednak tego było mało, to folder layouts w nowym sharepoincie nie nazywa się 'layouts/' (tak jak to było w sharepoint 2010), tylko... 'layouts/15/".
Na szczęście jest sposób, aby można było wykorzystywać te same pliki .cs w obu projektach. Oto on, czyli klasa UrlHelper:
public class UrlHelper
{
public static string LayoutsUrl
{
get
{
PropertyInfo pi = typeof(SPUtility).GetProperty(
"ContextLayoutsFolder", BindingFlags.Public | BindingFlags.Static);
if (pi == null)
return "/_layouts/";
else
return String.Format("/{0}/", pi.GetValue(null, null).ToString());
}
}
public static string ImagesUrl
{
get
{
PropertyInfo pi = typeof(SPUtility).GetProperty("ContextImagesRoot", BindingFlags.Public | BindingFlags.Static);
if (pi == null)
return "/_layouts/images/";
else
return String.Format("{0}", pi.GetValue(null, null).ToString());
}
}
public static string ControlTemplatesUrl
{
get
{
PropertyInfo pi = typeof(SPUtility).GetProperty(" ContextControlTemplatesFolder" , BindingFlags.Public | BindingFlags.Static);
if (pi == null)
return "/_CONTROLTEMPLATES/";
else
return String.Format("/{0}/", pi.GetValue(null, null).ToString());
}
}
}
W praktyce, wszędzie, gdzie odwołujemy się do katalogów związanych z 'layouts', zamiast wpisywać stringi, powinniśmy wykorzystać metodę klasy UrlHelper.
poniedziałek, 22 lipca 2013
Selenium - software testing framework for web applications
Przeglądając wykład Grzegorza Dudy podczas konferencji confitura 2012 pt. From Busy to Effective Developer odkryłem fajne, nowe narzędzie, które zademonstrował Grzegorz. Narzędzie nazywa się selenium i służy do testowania stron internetowych. O ile, nie wgłębiałem się szczegółowo w API tego narzędzia, to jego podstawowa funkcjonalność, dostępna jako plug-in do przeglądardki firefox służy do nagrywania/reprodukcji schematu poruszania się po stronie internetowej.
Czasami zdarza się bowiem, że aby odtworzyć błąd, trzeba się 'przeklikać' przez wiele formularzy (i dopiero wtedy podpiąć debugger). W takich właśnie momentach przydaje się Selenium. Za pierwszym razem, przeklikując się przez formularze włączamy opcję 'rejestrowania', a przy nast., okazji, gdy potrzebujemy wykonać identyczną operację tylko włączamy opcję odtwarzania poprzednio zapisanego scenariusza testowego.
Narzędzie dostępne jest na licencji Apache 2.0 więc spokojnie możemy z niego korzystać, a nawet rozwijać.
Czasami zdarza się bowiem, że aby odtworzyć błąd, trzeba się 'przeklikać' przez wiele formularzy (i dopiero wtedy podpiąć debugger). W takich właśnie momentach przydaje się Selenium. Za pierwszym razem, przeklikując się przez formularze włączamy opcję 'rejestrowania', a przy nast., okazji, gdy potrzebujemy wykonać identyczną operację tylko włączamy opcję odtwarzania poprzednio zapisanego scenariusza testowego.
Narzędzie dostępne jest na licencji Apache 2.0 więc spokojnie możemy z niego korzystać, a nawet rozwijać.
Subskrybuj:
Posty (Atom)

