2011-08-11 16 views
8

İlk olarak, bazı hızlı arkaplan ... Bir üçüncü taraf satıcıyla bir bütünleşmenin bir parçası olarak, bir grup bilgi içeren bir URL alan bir C# .Net web uygulamasına sahibim. sorgu dizesi. Bu URL bir MD5 hash ve paylaşılan bir gizli anahtarla imzalanır. Temel olarak, sorgu dizesini çekerim, karmalarını kaldırırım, kalan sorgu dizesinde kendi karımı gerçekleştiririm ve benimki sağlanan ürünle eşleştiğinden emin olurum..Net Uri Kodlama RFC 2396 vs RFC 3986

aşağıdaki şekilde Uri alınırken ediyorum ...

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

Sorunum bir özgü (ü) gibi özel karakterler içeren sorgu dizeleri kaynaklanmaktadır. Satıcı, hashlarını %FC olan RFC 2396 göstergesine dayanarak hesaplamaktadır. Benim C#. Net uygulaması %C3%BC olan RFC 3986 gösterimi dayalı bir karma olduğunu hesaplıyor. Söylemeye gerek yok, bizim karmalarımız eşleşmiyor ve hatalarımı atıyorum.

Strangely, documentation for the Uri class in .Net, RFC 3986'ya başka şekilde ayarlanmadıkça RFC 2396'yı izlemesini söylüyor, ancak bu davranış için gerekli olduğunu söylediğim web.config dosyamda girdim yok.

Uri yapıcısını RFC 2396 sözleşmesini kullanmaya nasıl zorlayabilirim?

Bunun başarısız olması, RFC 3986 sekizli çiftini RFC 2396 sekizlilere dönüştürmenin kolay bir yolu var mı? Bu kırmızı ringa biraz ise

+1

Sorunuzla ilgisi yok, ama neden burada yeni bir Uri oluşturuyorsunuz? String stringiFromVendor = Request.Url.Query.Substring (1); ' – magnattic

+0

Sadece hangi .NET sürümünü kullanıyorsunuz? –

+0

Kullanıyorum. Net 4.0. Ayrıca, merakla, 'Request.Url.Query' kullanmayı denediğimde, umlaut,% karakteri olan '% ufffd' olarak geliyordu. – Colin

cevap

2

şey yok, ama neden burada yeni Uri oluşturuyorsunuz? Sadece string queryFromVendor = Request.Url.Query.Substring(1) yapabilirsin; - atticae!

+1 atticae! Yarattığım Uri'yi ortadan kaldırmaya çalıştım ve aniden, dizge UTF-16 yerine UTF-8 olarak şifrelenen umuta sahipti. İlk başta bunun işe yarayacağını düşünmemiştim. Satır boyunca bir yerde, Request.QueryString'u kullanarak url'yi almayı denedim, ancak bu, the karakter olan %ufffd'un içeri girmesine neden oluyordu. Yeni bir bakış açısı kazanmak için, atticae'nin önerisini denedim ve işe yaradı.

Cevabın, something I read here ile ilgisi olduğundan eminim.

C#

ASP.NET varsayılan olarak UTF-8 kullanır ... Bu akarsular ve üzerine bize getir dosyalarla ilgili söz konusu olduğunda kodlamak için araçları ile, bütün dizelerinde UTF-16 kullanır, ve Request.Url uri alarak

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

...

Sorunlarım buradan kaynaklandı ... iyi bir seçim değildir bir anı düşünmek çok zor ve Başka bir uri yaratırken, C# standart UTF-16 olarak kodlandı. Orijinal uri'yi kullanarak, .Net standardı UTF-8'de kalmıştır.

Yardımlarınız için tüm teşekkürler.

+0

Sevindim Yardımcı olabilirim. – magnattic

1

merak ediyorum: FC üstten çift noktalı u UTF16 temsilidir çünkü

bunu söylemek; C2BC, UTF8 temsilidir.

Kaynak veriyi normal bir .Net dizesine dönüştürmek için System.Text.Encoding yöntemlerinden birinin yardımcı olabileceğini merak ediyorum.

Bu soru çok ilgi olabilir: Encode and Decode rfc2396 URLs

1

Ben Uri yapıcıları için standart kodlaması hakkında bilmiyorum, ama her şey başarısız olursa, her zaman URL'yi kendini deşifre ve ne gibi kodlama bunu kodlayabilirdi .

HttpUtility-Class Eğer ikinci parametre olarak System.Text.Encoding belirtmenize olanak sağlayan bir UrlDecode() ve UrlEncode() yöntemi vardır.

Örneğin

: Sorunuza ile ilgisi

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

UrlEncode yönteminin biraz aşırıya kaçmasına neden oluyor gibi görünüyor. çıkış dizede her şeyi şifreledi ... c% 00o% 00n% 00f% 00i% 00r% 00m% 00a% 00t% 00i% 00o% 00 ... – Colin

+0

Not: Umutut’u '% FC' olsa da. Biraz daha seçici olmanın bir yolu var mı? Bu yüzden, ampersanları, artıları ve% 00'ları kodlamıyor mu? – Colin

+0

Tamam, her şeyden önce:% 00 sonucu, sadece örnek olarak kullandığım utf-16 kodlamanın bir sonucudur. İstediğiniz şifrelemeyle değiştirin. Eğer ü,% FC'ye dönüştürülmesini istiyorsanız, belki de latin1'i arıyorsunuz: 'System.Text.Encoding.GetEncoding (" latin1 ")' – magnattic

İlgili konular