czwartek, 14 listopada 2013

Socket in C# - łączenie i wysyłanie wiadomości do serwera


Ostatnio po raz pierwszy byłem zmuszony użyć klasy Socket pisząc testy jednostkowe sprawdzające komunikację między klientem a serwerem z użyciem Socketów. Standardowo można stworzyć nową instancję klasy Socket, następie wywołać Connect i po połączeniu z serwerem wysłać do niego odpowiednią wiadomość. Ja jednak postanowiłem skrócić sobie pracę używając klasy TcpClient, która generalnie jest pewnym "wrapperem" nad klasą Socket, dzięki której po prostu możemy sobie pisać szybciej i mniej. Przykładowo w konstruktorze tej klasy następuje połączenie poprzez socket z serwerem, więc już nie muszę wołać metody Connect(), co wydaje się być mega fajne. Dodatkowo klasa TcpClient ma właściwość Client, która zwraca typ Socket.

Sama komunikacja z klienta na serwer wygląda następująco:

using (Socket socket = new TcpClient(host, port).Client)
{
   byte[] msg = Encoding.UTF8.GetBytes("This is a test");
   byte[] bytes = new byte[256];
   int bytesSent = socket.Send(msg);
   Assert.IsTrue(bytesSent > 0);
   int bytesReceived = socket.Receive(bytes);
   Assert.IsTrue(bytesReceived > 0);
}

Instalacja windows service za pomocą installutil - security access error

Czasami przychodzi potrzeba instalacji usługi Windows Service w środowisku developerskim bez używania installera. Jest to standardowy sposób przy tworzeniu nowego serwisu lub w przypadku gdy chcemy go zdebugować po raz pierwszy. Aby zainstalować taki windows service, który de facto jest naszą aplikacją konsolową należy w Visual Studio Command Prompt wpisać komendę:

installutil yourproject.exe

Czasami jednak wyskakuje błąd np. taki: "Security logs inaccessible". Oznacza to, że nie mamy dostatecznych praw na zainstalowanie serwisu i dodanie informacji o takim zdarzeniu do Event Loga. Rozwiązaniem jest po prostu uruchomienie Visual Studio Command Prompt jako administrator. "As simple as that"

piątek, 8 listopada 2013

"Symulacja" wysyłania maili - czyli inna metoda doręczenia maili

Jeśli piszecie funkcjonalność wysyłania maili a w środowisku developerskim nie macie dostępu do serwera smtp, istnieje prosty mechanizm, który pozwoli na symulację takiej wysyłki. Wystarczy w pliku konfiguracyjnym wartość w deliveryMethod zmienić z "Network" na "SpecifiedPickupDirectory" co skutkuje tym, że maile będą zapisywały się na dysku. Wystarczy jeszcze tylko podać gdzie dokładnie. 
Poniżej przykład:

<system.net>
  <mailSettings>
    <smtp deliveryMethod="SpecifiedPickupDirectory">
      <specifiedPickupDirectory pickupDirectoryLocation="c:\temp\maildrop\"/>
    </smtp>
  </mailSettings>
</system.net>

czwartek, 7 listopada 2013

X509FindType - FindBySerialNumber

Aby korzystać z połączenia SSL potrzeby nam jest odpowiedni certyfikat. Ostatnio w pracy nasz administrator systemu zmieniał certyfikat z "self-signed" na wystawiony przez "well know issuer" tak aby użytkownik zawsze widział ten certyfikat jako zaufany i aby nie było potrzeby dodawać odpowiedniego certyfikatu do TrustedPublishers. Administrator uaktualnił certyfikat a ja musiałem zmienić konfigurację w web.config tak aby serwis używał nowego certyfikatu. Aby znaleźć certyfikat musimy określić odpowiedni typ szukania. W naszym konfigu z FindBySubjectDistinguishedName zmieniliśmy na FindBySerialNumber. Zmieniłem, dodałem w findValue wartość z certyfikatu w polu SerialNumber ale klops! Okazało się, że certyfikat nie może być znaleziony. W związku z tym szybko na msdn i szukam. Okazało się, że wartość SerialNumber musi być wpisana bez spacji!!

The findValue parameter for the Find method must be a string that represents the serial number of the certificate as displayed by the certificate dialog box, but without the spaces

środa, 6 listopada 2013

Wyszukiwanie procedur składowanych


Ostatnio chciałem w bazie znaleźć wszystkie procedury składowane, które w ciele miały odpowiedni tekst. Wiedziałem, że trzeba szukać po jakiś obiektach systemowych SQL Servera ale nie byłem pewien jak dokładnie. 10 sekund w google zajęło mi znalezienie odpowiedniego skryptu:

SELECT OBJECT_NAME(id)
FROM SYSCOMMENTS
WHERE [text] LIKE '%Text_To_Search%'
AND OBJECTPROPERTY(id, 'IsProcedure') = 1

GROUP BY OBJECT_NAME(id)