Ostatnio w firmie napisałem aplikację, która łączy się poprzez webservice do "bardzo ważnego" systemu z punktu widzenia firmy. Program służy ludziom w jednej zdalnej lokalizacji (nazwijmy ją LZ), natomiast serwer znajduje się gdzie indziej. Droga z jednego punktu do drugiego, jest raczej długa mimo niewielkiej geograficznej odległości (ok. 5km). Pewnego dnia aplikacja przestała działać (firma też w tym momencie znacznie zwolniła).
Ale do rzeczy, po krótkim wywiadzie okazało się, że wywołanie metod serwisu skutkuje rzuceniem wyjątku. Dokładnie WebException skarżący się na "HTTP ERROR 417: Expectation failed". Po dalszym wywiadzie o co chodzi, okazało się iż sprawa ma się z nieodpowiednimi wpisami w nagłówku HTTP. Po uruchomieniu aplikacji w innym miejscu niż LZ, problem znikł. Okazało się, że ISP dostarczający sieć do LZ miesza coś w HTTP przy pomocy transparentnego proxy.
No dobra problem zidentyfikowany, ale teraz jak go ominąć? Proste: zabrońmy dostawcy mieszać nam w strumieniu zabezpieczając go przez szyfrowanie. Włączamy w webserwisie SSL, uprzednio generując certyfikat przy pomocy wbudowanego w IIS generatora certyfikatów. Następnie trzeba zmusić program kliencki by bez pytania akceptował ten certyfikat. Tu posłużyłem się informacjami znalezionymi tutaj. W ten sposób ominąłem problem i dodatkowo zabezpieczyłem dane.
Subskrybuj:
Komentarze do posta (Atom)
2 komentarze:
problem można rozwiązać ustwiając statyczną zmienną:
System.Net.ServicePointManager.Expect100Continue = false;
lub dodając do pliku konfiguracyjnego aplikacji klienckiej:
Teraz też o tym wiem, wtedy szukałem na szybko rozwiązania i to było pierwsze co wpadło mi do głowy. Też można to zmienić z poziomu web.config/app.config.
Prześlij komentarz