2016-04-05 15 views
0

Bir querystring parametresini kodlamak için HttpUtility.EncodeUrl kullanıyorum. Sunucuya istek gönderdiğimde Uri.AbsoluteUri sunucu tarafında --- bazı durumlarda --- farklı querystring param değerleri bulunur.Uri.AbsoluteUri istenen URL'den farklı

E.g.

: to-öncelenmelidir veri dizesi

string data = "+-/*.,?!~\"£$%^&*()_{}[]@'#<>\\|`¬;:="; 

HttpUtility.EncodeUrl (veri) sonuç

%2b-%2f*.%2c%3f!%7e%22%c2%a3%24%25%5e%26*()_%7b%7d%5b%5d%40%27%23%3c%3e%5c%7c%60%c2%ac%3b%3a%3d 

ama istek, sunucuda geldiğinde, HttpRequestMessage.RequestUri.AbsoluteUri farklı dizesi içerir olmasıdır

%2b-%2f*.%2c%3f!~%22%c2%a3%24%25%5e%26*()_%7b%7d[]%40'%23%3c%3e%5c%7c%60%c2%ac%3b:%3d 

Ben HMAC kimlik doğrulama mekanizması için bunları karşılaştırmak gerekir, bu yüzden işlevi ile bu sabit

/// <summary> 
    /// Gets escaped request URL string. 
    /// </summary> 
    /// <param name="uri"></param> 
    /// <returns></returns> 
    private string GetEscapedRequestUrl(Uri uri) 
    { 
     /** 
     * When client uses HttpUtility.UrlEncode() some chars in Uri.AbsoluteUri on server side are NOT url-endcoded. 
     * E.g. +-/*.,?!~"£$%^&*()_{}[]@'#<>\|`¬;:= 
     * client-side: %2b-%2f*.%2c%3f!%7e%22%c2%a3%24%25%5e%26*()_%7b%7d%5b%5d%40%27%23%3c%3e%5c%7c%60%c2%ac%3b%3a%3d 
     * server-side: %2b-%2f*.%2c%3f!~ %22%C2%A3%24%25%5E%26*()_%7B%7D[ ] %40' %23%3C%3E%5c%7C%60%C2%AC%3b: %3d  //note: spaces are added to show the difference 
     */ 
     string ret = string.Empty; 

     StringBuilder sb = new StringBuilder(); 
     sb.Append(uri.Scheme); 
     sb.Append("://"); 
     sb.Append(uri.Authority); 
     sb.Append(uri.LocalPath); 
     sb.Append(uri.Query 
      .Replace("~", "%7e") 
      .Replace("[", "%5b") 
      .Replace("]", "%5d") 
      .Replace("'", "%27") 
      .Replace(":", "%3a") 
     ); 

     ret = sb.ToString(); 

     return ret; 
    } 

Birisi bana, farkın nedenini ve bununla başa çıkmak için daha iyi bir yol varsa, lütfen düşüncelerinizi paylaşabilirsiniz.

cevap

0

EylemUri'dan 'a parametrenin türünü değiştirerek sorunu çözecektir.

Biraz deneme:

public ActionResult Test() 
{ 
    string data = "+-/*.,?!~\"£$%^&*()_{}[]@'#<>\\|`¬;:="; 

    return RedirectToAction("GetEncodedParam", new { data = HttpUtility.UrlEncode(data) }); 
} 

public ActionResult GetEncodedParam(string data) 
{ 
    var s = HttpUtility.UrlDecode(data); // here it's original string "+-/*.,?!~\"£$%^&*()_{}[]@'#<>\\|`¬;:=" 

    return new ContentResult { Content = s }; 
} 
İlgili konular