Czego nauczyłem się w 45 tygodniu 2017 roku?

Czas na nową serię – czego nauczyłem się danym tygodniu.  W tej serii będę się starał napisać klika słów oraz zamieści kilka linków z tego czego nowego nauczyłem się danego tygodnia.  Gdy nie będę miał materiałów no cóż albo urlop albo wstyd (wstyd nie nauczyć się czegoś codziennie).  Ponieważ inne serie się sprawdzają (z newsami) więc ta też powinna się przyjąć.  Na każdym „zaangażowanym” blogu programistycznym jest jakaś seria. Prawdziwa fala przeszła z kursami na meila-a.  Zapraszam serdecznie. W tym tygodniu: ServicePointManager, izolacja statycznych klas oraz atrybut Remote w ASP .NET

Na pomysł tej serii wpadłem, gdy przeczytałem co miesięczne posty z dochodów i pracy Pana Aniserowicza. Całkiem to fajny pomysł tak wszystko trzymać przejrzyście, więc jeśli On piszę o tym ile ma kasy, to ja mogę napisać czego się nowego dowiedziałem.

ServicePointManager

Ktoś miał problem na Slacku na kanale dotnet z robieniem requestów do serwera. W zwykłej aplikacji wyskakiwał mu błąd

„The underlying connection was closed: An unexpected error occurred on a send”

Sprawdziłem u siebie czy pod tym samym adresem się wbijam i wszystko było ok. Trochę nad tym posiedziałem i w końcu okazało się, że problem była wersja .NET. Ja testowałem na 4.6 a kolega na 4.5.

Okazało się, że między wersjami .NET 4.0 a .NET 4.5 klasa ServicePointManager.SecurityProtocol oferowała dodatkową obsługę protokołów, więc jeśli serwer nie obsługiwał wcześniejszych to trzeba ręcznie dodać dodatkowe protokoły lub skorzystać ze wszystkich możliwych. Aby to zrobić wystarczy przed reqest-em dodać taki kod:

ServicePointManager.SecurityProtocol = 
SecurityProtocolType.Tls |
SecurityProtocolType.Tls11 |
SecurityProtocolType.Tls12;

Moja odpowiedź na SO: https://stackoverflow.com/questions/46825061/c-sharp-clickatell-to-send-sms-http-get-request/46844082#46844082

Więcej informacji o tym problemie: https://stackoverflow.com/questions/32788409/c-sharp-httpwebrequest-the-underlying-connection-was-closed-an-unexpected-error/32789483#32789483

ps

i tak zarobiłem trochę reputacji na SO : )

Izolacja statycznych klas w C#

Zawsze szukałem jakiś sposobów na około aby mockować statyczne klasy w C#. Generalnie sprowadzało się to do zmiany architektury. Czasem nie było to możliwe więc rezygnowałem z brak czasu aż w końcu znalazłem, że można zamiast mockować zrobić izolację(shim) na tej klasie i działa to znakomicie (wcześniej robiłem izolację na web.configu).

Jedyna uwaga, że to narzędzie jest dostępne w VS od wersji Ultimate. Przynajmniej ten framework, którego ja używałem a jest to MicrosoftFake 

Wyjątkowo prosty i szybki.

Szczegóły MSDN: https://msdn.microsoft.com/pl-pl/library/hh549175.aspx

Bardzo bogaty opis jak go stosować na blogu Pana Zielińskiego: http://www.pzielinski.com/?p=2066 (polecam!)

I jeszcze jeden ważny link do przykładowych innych framework-ów do izolacji: https://stackoverflow.com/a/5866471/5816153

ASP.NET Remote

Czytam sobie teraz stary podręcznik do egzaminu 70-486 (ASP.NET MVC 4) i jak poprzednio z podręcznika do C# (70-483), zawsze się trafi jakiś kąsek, którego nigdy nie używałem a może by się przydał.

Jest to atrybut [Remote]. W skrócie taki atrybut dodany do klasy modelu, pozwala z poziomu strony wykonać validację on-line. Najbardziej oczywisty przykład zastosowania to po prostu „sugestie”

Przykłady jak to zastosować:

W kontrolerze piszemy sobie metodę IsUserAvailable:


public JsonResult IsUserAvailable(string username)
{
    if (!WebSecurity.UserExists(username))
    {
        return Json(true, JsonRequestBehavior.AllowGet);
    }
    string suggestedUID = String.Format(CultureInfo.InvariantCulture,
            "{0} is not available.", username);
    for (int i = 1; i < 100; i++)
    {
        string altCandidate = username + i.ToString();
        if (!WebSecurity.UserExists(altCandidate))
        {
            suggestedUID = String.Format(CultureInfo.InvariantCulture,
           "{0} is not available. Try {1}.", username, altCandidate);
            break;
        }
    }
    return Json(suggestedUID, JsonRequestBehavior.AllowGet);
}

Potem w modelu dodajemy atrybut [Remote]

[Required]
[StringLength(6, MinimumLength = 3)]
[Remote("IsUserAvailable", "Validation")]
[RegularExpression(@"(\S)+", ErrorMessage = "White space is not allowed.")]
[Editable(true)]
public string UserName { get; set; }

Na stronie muszą być dostępne skrypty:

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

A żeby to działało musimy w web.config-u dodać wpisy:

<appSettings>
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>

Voila i działa.

Jak to z takimi narzędziami, to super się czyta ale w prawdziwym biznesowym świecie  problemów, oczywiście nie będzie to już takie w sam raz.  Jednak na szybko całkiem miła perspektywa.

Przykład zastosowania w MVC 5: https://stackoverflow.com/a/37430821/5816153

Czysta dokumentacja: https://msdn.microsoft.com/en-us/library/system.web.mvc.remoteattribute(v=vs.118).aspx

Podsumowanie

Trochę  tego było. Może nic z najnowszych technologi, ale najnowsze technologie zasługują na odrębne wpisy. Z drugiej strony człowiek piszę o tym z czym się spotyka więc tak naprawdę to samo praktycznie mięso.