SORU
27 EKİM 2011, PERŞEMBE


IIS yasadışı bir karakter değişimi gerçekleştirme? Eğer öyleyse, bunu durdurmak için nasıl?

İçerik: ASP.NET MVC IIS çalışan, bir bir ile UTF-8'i ile kodlanmış bir URL.

Standart proje şablonu kullanarak, ve bir test-eylem HomeController gibi:

public ActionResult Test(string id)
{
    return Content(id, "text/plain");
}

Bu işleri en iyi %kodlanmış UTF-8 gibi yolları:

http://mydevserver/Home/Test/京都弁

beklenen sonuç 京都弁

Ancak bu yolu kullanarak:

http://mydevserver/Home/Test/

url ' dirdeğildoğru aldı.

Kenara: %kodlanmış kod noktası 0xE4FB; temel-dilli-uçak, özel kullanım alanı; ama sonuçta - geçerli bir unicode kod noktası; sen-ebilmek doğrulamak bu el ile veya üzerinden:

string value = ((char) 0xE4FB).ToString();
string encoded = HttpUtility.UrlEncode(value); // 

Şimdi, ne olur bir sonraki bağlı web sunucusu, Visual Studio Development Server (cassini aka), doğru id alınan bir dize uzunluğu, içeren kod noktası 0xE4FB.

Ancak, IIS veya IIS Express bunu yaparsam, bir farklı id, "î“»" kod noktaları özellikle alıyorum: 0xEE, 0x201C, 0xBB. Hemen ilk tanıyan ve başlangıç olarak geçen ve ortada ne yüzde olarak kodlanmış dize... yani sonu olur mu?

İyi:

IIS benim url işlenirken alıntı-çeviri çeşit gerçekleştirmiş gibi bana çok fazla görünüyor. Belki de bu bir kaç senaryo olarak kullanıyor olabilir (bilmiyorum) ama kesinlikle %kodlanmış UTF-8 blok ortasında olduğu zaman kötü bir şey değildir.

HttpContext.Current.Request.Raw unutmayınayrıcagösterir bu çeviri bu MVC bir hata gibi görünüyor; ayrıca Darin yorum not değildir, bu yüzden oluştu, farklı bir url yolu vs sorgu bölümünde çalışır vurgulama vardır.

Yani (iki kısımlı):

  1. benim analiz unicode bazı önemli incelik eksik url işleme/?
  2. bunu nasıl düzeltebilirim? (yani beklenen karakter alıyorum bu yüzden yapmak)

CEVAP
27 EKİM 2011, PERŞEMBE


id = Encoding.UTF8.GetString(Encoding.Default.GetBytes(id));

Bu, özgün kimliğini verecek. IIS Varsayılan (ANSI) yolu karakter kodlamasını kullanır. Url olarak kodlanmış bir dize ve garip bir şey geri alıyoruz neden olduğunu kullanarak çözülür.

Orijinal kimliği almak için geri bayt dönüştürmek ve dize UTF-8 kodlaması geçebilirler.

Unicode and ISAPI Filters bkz

ISAPI Filtresi bir ANSI API - /API kullanarak çalışabilirsin tüm değerler. ANSI olmalıdır. Evet, bu şok edici olduğunu biliyorum, tüm sonra, 2006 ve günümüzde her şeyi Unicode... ama bu API unutmayın neredeyse hiçbir şey 32 bit, fazla olduğunda, daha bir on yıl kadar önce keşfedilmiştir az Unicode. Ayrıca, ISAPI olan HTTP protokolü unutma doğrudan ANSI ve Unicode değil yönetir.

DÜZENLEME:En çok karakter ile çalıştığından bahsetmiştin beri yani IIS bu durumda başarısız olan algılama mekanizması kodlama bir tür olduğunu sanıyorum. Bu char ıd önek, ancak geçici bir çözüm olarak ve daha sonra kolay eğer sorun olursa bu char yoksa () oluştu algılayabilirsiniz. Çok ideal bir çözüm değil ama işe yarayacaktır. Sonra özel model binder ve tüketim temizleyici kodu yapmak ASP.NET MVC kapsayıcı bir sınıf yazabilirsiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Goran Dimov

    Goran Dimov

    1 HAZİRAN 2014
  • NPR

    NPR

    22 NİSAN 2006
  • wwjoshdew

    wwjoshdew

    1 AĞUSTOS 2007