2011-08-11 10 views
8

Po pierwsze, niektóre szybkie tło ... W ramach integracji z zewnętrznym dostawcą, mam aplikację internetową w języku C# .Net, która otrzymuje adres URL z wieloma informacjami w ciąg zapytania. Ten adres URL jest podpisany za pomocą skrótu MD5 i wspólnego tajnego klucza. Zasadniczo przeciągam ciąg zapytania, usuwam jego skrót, wykonuję swój skrót na pozostałym ciągu zapytania i upewniam się, że mój odpowiada temu, który został dostarczony.. Net Uri Kodowanie RFC 2396 kontra RFC 3986

mam pobierania URI w następujący sposób ...

Uri uriFromVendor = new Uri(Request.Url.ToString()); 
string queryFromVendor = uriFromVendor.Query.Substring(1); //Substring to remove question mark 

Mój problem jest wynikające z ciągów zapytań, które zawierają znaki specjalne jak umlaut (U). Dostawca oblicza swój skrót na podstawie reprezentacji RFC 2396, która jest %FC. Moja aplikacja C# .Net oblicza wartość hash na podstawie reprezentacji RFC 3986, która jest %C3%BC. Nie trzeba dodawać, że nasze skróty nie pasują do siebie i wrzucam moje błędy.

Co dziwne, kod mówi, że powinien on być zgodny z RFC 2396, chyba że ustawiono inaczej dla RFC 3986, ale nie mam wpisu w moim pliku web.config, który według nich jest wymagany dla tego zachowania.

Jak zmusić konstruktora Uri do korzystania z konwencji RFC 2396?

W przypadku niepowodzenia, czy istnieje prosty sposób na konwersję par oktetów RFC 3986 na oktety RFC 2396?

+1

Nic wspólnego z twoim pytaniem, ale dlaczego tworzysz nowego Uri? Możesz po prostu zrobić 'string queryFromVendor = Request.Url.Query.Substring (1);' – magnattic

+0

Z której wersji .NET korzystasz? –

+0

Używam .Net 4.0. Co ciekawe, gdy próbowałem używać 'Request.Url.Query', umlaut przychodził jako'% ufffd', który jest znakiem . – Colin

Odpowiedz

2

Nic wspólnego z pytaniem, ale dlaczego ty tworząc nowy URI tutaj? Możesz po prostu zrobić string queryFromVendor = Request.Url.Query.Substring(1); - atticae

+1 dla atticae! Wróciłem, aby spróbować usunąć zewnętrzne Uri, które tworzyłem i nagle, ciąg miał zaklęcie zakodowane jako UTF-8 zamiast UTF-16.

Początkowo nie sądziłem, że to zadziała. Gdzieś wzdłuż linii próbowałem pobrać URL używając Request.QueryString, ale spowodowało to pojawienie się umlaut jako %ufffd, która jest znakiem . Mając na uwadze świeże spojrzenie, spróbowałem sugestii atticae i zadziałało.

Jestem prawie pewny, że odpowiedź ma związek z something I read here.

C# używa UTF-16 we wszystkich swoich strun, z narzędziami do kodowania, jeśli chodzi o kontaktach z potoków i plików, które przynoszą nam na ...

ASP.NET używa UTF-8 domyślnie i trudno jest myśleć o czasie, gdy nie jest to dobry wybór ...

Moje problemy wynikały stąd ...

Uri uriFromVendor = new Uri(Request.Url.ToString()); 

Podejmując Request.Url uri i tworząc kolejne URI, kodowanie było standardem UTF-16 w C#. Używając oryginalnego pliku uri, pozostał on w standardzie .Net UTF-8.

Dziękuję wszystkim za pomoc.

+0

Cieszę się, że mogę pomóc. – magnattic

1

Zastanawiam się, czy to jest trochę czerwonego śledzia:

Mówię to, bo FC jest reprezentacja UTF16 z uz umlaut; C2BC jest reprezentacją UTF8.

Zastanawiam się, czy jedna z metod System.Text.Encoding do konwersji danych źródłowych na normalny ciąg .NET może pomóc.

To pytanie może być interesujące także: Encode and Decode rfc2396 URLs

1

nie wiem o standardzie kodowania dla konstruktorów uri, ale jeśli wszystko inne zawiedzie zawsze można zdekodować adres URL siebie i zakodować go w jakiejkolwiek kodowanie lubisz .

Metoda HttpUtility-Class ma metodę UrlDecode() i UrlEncode(), która umożliwia określenie parametru System.Text.Encoding jako drugiego parametru.

Na przykład:

string decodedQueryString = HttpUtility.UrlDecode(Request.Url.Query.Substring(1)); 
string encodedQueryString = HttpUtility.UrlEncode(decodedQueryString, System.Text.Encoding.GetEncoding("utf-16")); 
// calc hash here 
+0

Wygląda na to, że metoda UrlEncode jest trochę nadgorliwa. wyjście zakodowało wszystko w ciągu znaków ... c% 00o% 00n% 00f% 00i% 00r% 00m% 00a% 00t% 00i% 00o% 00 ... – Colin

+0

Uwaga: Udało się przekonwertować umlaut z powrotem na '% FC' chociaż. Czy istnieje sposób na nieco bardziej selektywny sposób, aby nie kodować ampersandów, plusów i% 00? – Colin

+0

OK, przede wszystkim: Wynik% 00 jest wynikiem kodowania utf-16, którego użyłem tutaj jako przykładu. Zastąp go odpowiednim kodowaniem. Jeśli chcesz przekonwertować ü na% FC, to może szukasz latin1: 'System.Text.Encoding.GetEncoding (" latin1 ")' – magnattic

Powiązane problemy