টিএল; ডিআর: স্বীকৃত সংস্করণটি ব্যবহার করবেন না কারণ এটি ইউনিকোড অক্ষর পরিচালনা করার ক্ষেত্রে সম্পূর্ণরূপে ভেঙে গেছে এবং অভ্যন্তরীণ এপিআই কখনও ব্যবহার করবেন না
আমি গ্রহণযোগ্য সমাধানের সাথে অদ্ভুত ডাবল এনকোডিংয়ের সমস্যাটি পেয়েছি:
সুতরাং, আপনি যদি এমন অক্ষরগুলি নিয়ে কাজ করছেন যা এনকোড করা দরকার, স্বীকৃত সমাধান ডাবল এনকোডিংয়ের দিকে নিয়ে যায়:
- ক্যোয়ারী প্যারামিটারগুলি
NameValueCollectionইনডেক্সার ব্যবহার করে স্বয়ংক্রিয়ভাবে এনকোড হয় ( এবং এটি ব্যবহার করে UrlEncodeUnicode, নিয়মিত প্রত্যাশিত নয় UrlEncode(!) )
- তারপরে, আপনি যখন কল করবেন
uriBuilder.Uriএটি নির্মাণকারী Uriব্যবহার করে নতুন তৈরি করে যা আরও একবার এনকোডিং করে (সাধারণ url এনকোডিং)
- এটি করে এড়ানো যায় না
uriBuilder.ToString() (যদিও এটি প্রত্যাবর্তন করে Uriযা সঠিকভাবে IMO কমপক্ষে অসঙ্গতি, সম্ভবত কোনও বাগ, তবে এটি অন্য প্রশ্ন) এবং তারপরে HttpClientপদ্ধতি গ্রহণ করার স্ট্রিংটি ব্যবহার করে - ক্লায়েন্টটি এখনও Uriআপনার পাস করা স্ট্রিংটি তৈরি করে:new Uri(uri, UriKind.RelativeOrAbsolute)
ছোট, তবে সম্পূর্ণ তিরস্কার:
var builder = new UriBuilder
{
Scheme = Uri.UriSchemeHttps,
Port = -1,
Host = "127.0.0.1",
Path = "app"
};
NameValueCollection query = HttpUtility.ParseQueryString(builder.Query);
query["cyrillic"] = "кирилиця";
builder.Query = query.ToString();
Console.WriteLine(builder.Query); //query with cyrillic stuff UrlEncodedUnicode, and that's not what you want
var uri = builder.Uri; // creates new Uri using constructor which does encode and messes cyrillic parameter even more
Console.WriteLine(uri);
// this is still wrong:
var stringUri = builder.ToString(); // returns more 'correct' (still `UrlEncodedUnicode`, but at least once, not twice)
new HttpClient().GetStringAsync(stringUri); // this creates Uri object out of 'stringUri' so we still end up sending double encoded cyrillic text to server. Ouch!
আউটপুট:
?cyrillic=%u043a%u0438%u0440%u0438%u043b%u0438%u0446%u044f
https://127.0.0.1/app?cyrillic=%25u043a%25u0438%25u0440%25u0438%25u043b%25u0438%25u0446%25u044f
আপনি দেখতে পাচ্ছেন, আপনি uribuilder.ToString()+ httpClient.GetStringAsync(string)বা uriBuilder.Uri+ httpClient.GetStringAsync(Uri)ডাবল এনকোডড প্যারামিটার প্রেরণ শেষ না করেই কোনও ব্যাপার নয়
স্থির উদাহরণ হতে পারে:
var uri = new Uri(builder.ToString(), dontEscape: true);
new HttpClient().GetStringAsync(uri);
তবে এটি অপ্রচলিত Uri কনস্ট্রাক্টর ব্যবহার করে
উইন্ডোজ সার্ভারে আমার সর্বশেষ Uri.NET- এ পিএস, বুল ডক মন্তব্য সহ নির্মাতা বলেছেন "অপ্রচলিত, ডানসেক্টপ সর্বদা মিথ্যা", তবে বাস্তবে প্রত্যাশায় কাজ করে (পালিয়ে যাওয়া এড়িয়ে যায়)
সুতরাং এটি অন্য বাগের মতো দেখাচ্ছে ...
এমনকি এটিও সাধারণভাবে ভুল - এটি সার্ভারে UrlEncodedUnicode প্রেরণ করে, কেবল সার্ভারের প্রত্যাশা অনুযায়ী urlCoded হয় না
আপডেট: আরও একটি বিষয় হ'ল নেমভ্যালিউ কালেকশনটি আসলে আরলিনকোড ইউনিকোড করে, যা আর ব্যবহার করা হয় না বলে মনে করা হয় এবং এটি নিয়মিত url.encode / ডিকোডের সাথে বেমানান ( URL টি কোয়েরিতে নেমভ্যালু সংগ্রহটি দেখুন ? )।
সুতরাং নীচের লাইনটি হ'ল: এই হ্যাকটি কখনই ব্যবহার করবেন নাNameValueCollection query = HttpUtility.ParseQueryString(builder.Query); কারণ এটি আপনার ইউনিকোড ক্যোয়ারী প্যারামিটারগুলিকে গোলমাল করবে। কেবল ম্যানুয়ালি ক্যোয়ারী তৈরি করুন এবং এটি নির্ধারণ করুন UriBuilder.Queryযা প্রয়োজনীয় এনকোডিং করবে এবং তারপরে উরি ব্যবহার করবে UriBuilder.Uri।
কোড ব্যবহার করে নিজেকে আঘাত করার প্রধান উদাহরণ যা এ জাতীয় ব্যবহার করা হবে না বলে মনে করা হয়