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 dizesistring 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.