এইচটিপিপি্লিয়েন্ট বেসএড্রেস কেন কাজ করছে না?


299

নিম্নলিখিত কোডটি বিবেচনা করুন, যেখানে BaseAddressআংশিক ইউআরআই পথ নির্ধারণ করা হয়েছে।

using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
    client.BaseAddress = new Uri("http://something.com/api");
    var response = await client.GetAsync("/resource/7");
}

আমি এটি একটি GETঅনুরোধ সম্পাদন আশা করি http://something.com/api/resource/7। তবে তা হয় না।

কিছু অনুসন্ধানের পরে, আমি এই প্রশ্ন এবং উত্তরটি খুঁজে পাই: বেসএড্রেস সহ এইচটিপিপি্লায়েন্ট । পরামর্শটি /শেষের দিকে রাখা উচিত BaseAddress

using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
    client.BaseAddress = new Uri("http://something.com/api/");
    var response = await client.GetAsync("/resource/7");
}

এটি এখনও কাজ করে না। এখানে ডকুমেন্টেশন রয়েছে: এইচটিপিপিলেট : বেসএড্রেস এখানে কী চলছে?



@। বিপরীত সদৃশটি ইতিমধ্যে প্রস্তাব করা হয়েছে। আমি এই প্রশ্নটি বিশেষভাবে লিখেছি কারণ অন্য প্রশ্নটি এমনভাবে লেখা হয়নি যা একই সমস্যাযুক্ত লোকেরা খুব আবিষ্কারযোগ্য ছিল, এবং আমি উত্তর এখানে লিখেছিলাম কারণ উত্তরটি এখানে একটি গুরুত্বপূর্ণ বিষয় রেখে গেছে।
টিমোথি শিল্ডস

তবে এই প্রশ্নটি পরে জিজ্ঞাসা করা হয়েছে
জর্জি লানেটজ

2
@ ГеоргийЛанец এটি কীভাবে কাজ করে তা নয়। সাধারণত সবচেয়ে "ক্যানোনিকাল" প্রশ্নটি হ'ল ডুপ্লিকেটগুলি তার দিকে নির্দেশ করে। এই অন্যান্য প্রশ্নটি এমন একটি সমস্যা সম্পর্কে ছিল যা ব্যবহারকারীরা প্রায়শই জিজ্ঞাসিত প্রশ্নাবলীর মতো পড়ার পরিবর্তে আসছিল।
তীমথিয় শিল্ডস

2
@ ГеоргийЛанец এছাড়াও আমি এই প্রশ্নের অন্যান্য প্রশ্নটি উল্লেখ করে নোট করব এবং সমস্যাটি সমাধানের জন্য অন্যান্য প্রশ্ন এবং উত্তর কেন অপর্যাপ্ত তা আমি ব্যাখ্যা করি।
টিমোথি শিল্ডস

উত্তর:


719

দেখা যাচ্ছে যে, BaseAddressএবং সম্পর্কিত ইউআরআই GetAsyncপদ্ধতিতে অনুসরণ করা বা অগ্রণী স্ল্যাশ যুক্ত বা বাদ দেওয়ার সম্ভাব্য চারটি অনুমতিের মধ্যে - বা অন্য যে কোনও পদ্ধতিতে HttpClient- কেবলমাত্র এক ক্রমশক্তি কাজ করে। আপনাকে অবশ্যই শেষের দিকে একটি স্ল্যাশ স্থাপন BaseAddressকরতে হবে এবং নীচের উদাহরণের মতো আপনার সম্পর্কিত ইউআরআইয়ের শুরুতে স্ল্যাশ স্থাপন করা উচিত নয়

using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
    client.BaseAddress = new Uri("http://something.com/api/");
    var response = await client.GetAsync("resource/7");
}

যদিও আমি আমার নিজের প্রশ্নের উত্তর দিয়েছি, আমি বুঝতে পেরেছি যে আমি এখানে সমাধানটির জন্য অবদান রাখছি, আবারও, এই বন্ধুত্বপূর্ণ আচরণটি বিনষ্টিত নয়। আমার সহকর্মী এবং আমি দিনের বেশিরভাগ সময় একটি সমস্যা সমাধানের চেষ্টা করে কাটিয়েছি যা শেষ পর্যন্ত এই অদ্ভুততার কারণে হয়েছিল HttpClient


4
ধন্যবাদ. এটি আজ দু'দিন ধরেই যে সমস্যার সাথে লড়াই করে যাচ্ছি তা সমাধান করেছে, আজুরে ফিরে যাওয়া, আইআইএসে ফিরে যাওয়া এবং আইআইএস এক্সপ্রেসে ফিরে আসা, যা সর্বাধিক অভদ্রভাবে ভুল জায়গায় স্থান দেওয়া বা অতিরিক্ত ফরোয়ার্ড স্ল্যাশগুলিকে উপেক্ষা করে। একবার আমার বেস ক্লাসে সেট RestClientএটা প্রায় অদৃশ্য এবং সব সময়ে কোন মনোযোগ পেয়েছেন, এবং আমি কখনও আমার ব্রেকপয়েন্ট ইত্যাদি এ সম্পূর্ণ URL দেখে
ProfK

43
আমি নিশ্চিত করতে পারি যে এই বিজোড়তা (এবং এই ফিক্স) এখনও। নেট কোর মধ্যে প্রাসঙ্গিক। আমার চুল টানা টিমোথি হ্রাস করার জন্য ধন্যবাদ।
নাট বার্বেটিনি

8
কারণ এটি স্ল্যাশকে অনুসরণ না করেই যখন এটি অনুরোধ তৈরি করে এটি শেষ অংশটি হ্রাস করে। সুতরাং এটি হিট করে কিছু / রিসোর্স / 7 । যদি আপনি বেস ঠিকানাটি কিছু / কম হিসাবে সেট করেন (স্ল্যাশের সাথে বা পিছনে পিছনে পিছনে কিছু যায় আসে না) আপনি এপিআই / সংস্থান / 7 এর শুরুতে স্ল্যাশ রেখেছিলেন তাও কিছু যায় আসে না। ট্রেড স্ল্যাশ ছাড়াই বেস ঠিকানার শেষ অংশটি একটি ফাইলের মতো বিবেচনা করা হয় এবং বাল্ডিংয়ের অনুরোধের সময় বাদ দেওয়া হয়।
পাইওটর পেরাক

12
এটি সরাসরি আসল প্রশ্নটি সম্বোধন করে না তবে সম্পর্কিত। প্রতি মিরকোসোফ্ট, এইচটিটিপিসিলেট () এর একটি উদাহরণ একটি স্ট্যাটিক ভেরিয়েবল এবং পুনঃব্যবহার করা উচিত ( ডকস.মাইক্রোসফট.ইন.ইউএস / এসপিনেট / ওয়েবে- এপি / ওভারভিউ / অ্যাডভান্সড/… - Creating a new HttpClient instance per request can exhaust the available sockets)। সুতরাং আপনি () ব্যবহার অপসারণ বিবেচনা করা উচিত।
sanmcp

6
কেবল একটি ভয়াবহ বাস্তবায়ন। তারা কেন এটি ঠিক করে না?
টিমমক্রাউজ

55

রেফারেন্স রেজোলিউশনটি আরএফসি 3986 ইউনিফর্ম রিসোর্স আইডেন্টিফায়ার (ইউআরআই) দ্বারা বর্ণনা করা হয়েছে: জেনেরিক সিনট্যাক্স । এবং ঠিক এটি কাজ করার অনুমিত হয়। বেস ইউআরআই পাথ সংরক্ষণ করার জন্য আপনাকে বেস ইউআরআইয়ের শেষে স্ল্যাশ যুক্ত করতে হবে এবং আপেক্ষিক ইউআরআইয়ের শুরুতে স্ল্যাশ সরিয়ে ফেলতে হবে।

যদি বেস ইউআরআইতে শূন্যপথ না থাকে তবে মার্জ প্রক্রিয়াটি এর শেষ অংশটি (শেষের পরে /) বাতিল করে দেয় । প্রাসঙ্গিক বিভাগ :

5.2.3। পাথ মার্জ করুন

উপরের সিউডোকোডটি বেস ইউআরআইয়ের পথের সাথে আপেক্ষিক-পথের রেফারেন্সটি মার্জ করার জন্য "মার্জ" রুটিনকে বোঝায়। এটি নিম্নলিখিত হিসাবে সম্পন্ন করা হয়:

  • যদি বেস ইউআরআইয়ের একটি সংজ্ঞায়িত কর্তৃত্ব উপাদান এবং একটি ফাঁকা পথ থাকে, তবে রেফারেন্সের পথের সাথে "/" সমন্বিত একটি স্ট্রিং ফিরিয়ে দিন; অন্যভাবে

  • বেস ইউআরআই-এর পাথের শেষ অংশটি ব্যতীত সকলের সাথে সংযুক্ত রেফারেন্সের পাথ উপাদানটি যুক্ত একটি স্ট্রিং ফিরিয়ে দিন (অর্থাত্, বেস ইউআরআই পথে ডান-সর্বাধিক "/" পরে কোনও অক্ষর বাদ দেওয়া বা পুরো বেস ইউআরআই পথ বাদ দিলে কোনও "/" অক্ষর ধারণ করে না)।

যদি আপেক্ষিক ইউআরআই একটি স্ল্যাশ দিয়ে শুরু হয় তবে একে একে পরম-পথে আপেক্ষিক ইউআরআই বলা হয়। এই ক্ষেত্রে মার্জ প্রক্রিয়া সমস্ত বেস ইউআরআই পথ উপেক্ষা করুন। আরও তথ্যের জন্য 5.2.2 দেখুন। রেফারেন্স বিভাগে রূপান্তর করুন


3
এইচটিটিপিপ্লিনেন্টের মতো দুর্দান্ত তবে ক্লায়েন্টের গ্রন্থাগারগুলি আমাদের এর মতো গুরূত্বপূর্ণ প্রয়োগের বিবরণ থেকে আমাদের রক্ষা করবে বলে মনে করা হচ্ছে।
জেমি আইডে

-1

এইচটিটিপিসিলেট সহ একটি ইস্যুতে ছড়িয়ে গেল, এমনকি প্রস্তাবনাগুলি প্রমাণীকরণের জন্য এটি এখনও পেতে পারেনি। আমার আপেক্ষিক পথে আমার পিছনে '/' দরকার Turn

অর্থাত

var result = await _client.GetStringAsync(_awxUrl + "api/v2/inventories/?name=" + inventoryName);
var result = await _client.PostAsJsonAsync(_awxUrl + "api/v2/job_templates/" + templateId+"/launch/" , new {
                inventory = inventoryId
            });

-6

বিকল্পভাবে - মোটেও ব্যবহার করবেন না BaseAddress। পুরো URL টি এতে রাখুন GetAsync()


33
যাই হোক না কেন প্রশ্নের উত্তর দেয় না।
আর্চিবল্ড

7
বেসএড্রেস শব্দ কমায়। যাই হোক আমার চোখে। :)
মেটালমাইকস্টার

2
নেতিবাচক মন্তব্যের সাথে আমার একমত হতে হবে। আমার এইচটিটিপি ক্লায়েন্ট কলগুলি কেন আমার ডেভ পিসিতে কাজ করে তবে সার্ভারে ব্রেক হয়ে যায় তা জানার চেষ্টা করে আমি 2 দিন অতিবাহিত করেছি। অদ্ভুতভাবে পাওয়ারশেল কাজ করে কিন্তু। নেট তা করে না। আমি ব্যবহার করছিলাম .SendAsyc। তারপরে আমি আবিষ্কার করেছিলাম .গেটএ্যাসিক কাজ করেছিল। এটি আমাকে একটি অন্য রাস্তায় নামায় এবং শেষ পর্যন্ত এখানে। বেস ঠিকানা এবং আপেক্ষিক URL এর মধ্যে / যুক্ত করা বা অপসারণ কিছুই করেনি। তবুও ৪০৪ টি ত্রুটি পেয়েছে .... তবে যখন আমি বেস ঠিকানাটি সেট না করে, এবং পুরো পথটি সম্পর্কিত করে রাখি .. এটি কাজ করে! আবার, এটি সহ .SendAsync তবে 2 দিন ছিল আমি কখনই ফিরে পাব না!
দা_জোককার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.