এটি কিছুটা পুরানো থ্রেড, তবে যেহেতু আমি এখানে এসেছি, আমি অনুভব করেছি যে আমি আমার অনুসন্ধানগুলি পোস্ট করেছি যাতে তারা অন্যদের সহায়তা করতে পারে।
প্রথমত, আমার একই সমস্যা ছিল, যেখানে আমি অনুরোধ.বাডি পেতে এবং এটি (লগিং / অডিটিং) দিয়ে কিছু করতে চাই। তবে অন্যথায় আমি শেষ পয়েন্টটি দেখতে একই রকম দেখতে চাই।
সুতরাং, দেখে মনে হচ্ছিল সক্ষমযোগ্য বাফারিং () কলটি কৌশলটি করতে পারে। তারপরে আপনি শরীরে সিক (0, এক্সএক্সএক্সএক্স) করতে পারেন এবং সামগ্রীগুলি পুনরায় পড়তে পারেন
যাইহোক, এটি আমার পরবর্তী সমস্যার দিকে পরিচালিত করেছিল। আমি শেষ পয়েন্টে অ্যাক্সেস করার সময় ব্যতিক্রমগুলি "সিনক্রোনাস অপারেশনগুলি নিষিদ্ধ করা হয়" পেতে চাই। সুতরাং, বিকল্পটির মধ্যে সম্পত্তিটিকে AllowSynchronousIO = সত্য সেট করতে হবে। এটি সম্পাদন করার বিভিন্ন উপায় রয়েছে (তবে এখানে বিশদটি গুরুত্বপূর্ণ নয়)
তারপরে, পরবর্তী সমস্যাটি হ'ল আমি যখন অনুরোধটি পড়তে যাই ody রক্তাক্ত এটি ইতিমধ্যে নিষ্পত্তি হয়ে গেছে। উঃ তো, কি দেয়?
আমি এন্ডপায়ান্ট কলটিতে নিউটনসফট.জসনকে আমার [ফ্রমবডি] পার্সার হিসাবে ব্যবহার করছি। সিঙ্ক্রোনাস রিডের জন্য এটিই দায়ী এবং এটি হয়ে গেলে স্ট্রিমটিও বন্ধ করে দেয়। সমাধান? JSON পার্সিংয়ের আগে স্ট্রিমটি পড়ুন? অবশ্যই, এটি কাজ করে এবং আমি এটি দিয়ে শেষ করেছি:
public class ReadRequestBodyIntoItemsAttribute : AuthorizeAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
if (context == null) return;
var syncIOFeature = context.HttpContext.Features.Get<IHttpBodyControlFeature>();
if (syncIOFeature != null)
{
syncIOFeature.AllowSynchronousIO = true;
var req = context.HttpContext.Request;
req.EnableBuffering();
if (req.Body.CanSeek)
{
req.Body.Seek(0, SeekOrigin.Begin);
using (var reader = new StreamReader(
req.Body,
encoding: Encoding.UTF8,
detectEncodingFromByteOrderMarks: false,
bufferSize: 8192,
leaveOpen: true))
{
var jsonString = reader.ReadToEnd();
context.HttpContext.Items.Add("request_body", jsonString);
}
req.Body.Seek(0, SeekOrigin.Begin);
}
}
}
}
সুতরাং এখন, আমি এইচটিপিঙ্কটেক্সট.আইটেমগুলি ব্যবহার করে শরীরে প্রবেশ করতে পারি] আইটেমগুলি ["রিকোয়েস্টবিডিআইন্টো আইটেম] বৈশিষ্ট্যযুক্ত শেষ পয়েন্টগুলিতে [" অনুরোধ_বডি "]।
কিন্তু মানুষ, এটি অনেকগুলি হুপের মধ্য দিয়ে যেতে পারে। সুতরাং এখানেই আমি শেষ করেছি এবং আমি এতে সত্যই খুশি।
আমার শেষ পয়েন্টটি এমন কিছু হিসাবে শুরু হয়েছিল:
[HttpPost("")]
[ReadRequestBodyIntoItems]
[Consumes("application/json")]
public async Task<IActionResult> ReceiveSomeData([FromBody] MyJsonObjectType value)
{
val bodyString = HttpContext.Items["request_body"];
}
তবে কেবল স্বাক্ষরটি পরিবর্তন করা আরও সহজ straight
[HttpPost("")]
[Consumes("application/json")]
public async Task<IActionResult> ReceiveSomeData()
{
using (var reader = new StreamReader(
Request.Body,
encoding: Encoding.UTF8,
detectEncodingFromByteOrderMarks: false
))
{
var bodyString = await reader.ReadToEndAsync();
var value = JsonConvert.DeserializeObject<MyJsonObjectType>(bodyString);
}
}
আমি সত্যিই এটি পছন্দ করেছি কারণ এটি একবারে কেবলমাত্র দেহের স্ট্রিমটি পড়ে এবং ডেসরিয়ালাইজেশন করার নিয়ন্ত্রণ আমার আছে। অবশ্যই, এএসপি.নেট কোর যদি আমার জন্য এই যাদুটি করে তবে এটি দুর্দান্ত তবে এখানে আমি দুবার স্ট্রিমটি পড়ার সময় নষ্ট করি না (সম্ভবত প্রতিবারের জন্য বাফারিং করা), এবং কোডটি বেশ পরিষ্কার এবং পরিষ্কার।
আপনার যদি প্রচুর এন্ডপয়েন্টগুলিতে এই কার্যকারিতাটির প্রয়োজন হয় তবে মিডলওয়্যারগুলির পন্থাগুলি পরিষ্কার হতে পারে, বা কোডটি আরও সংক্ষিপ্ত করে তুলতে আপনি কমপক্ষে শরীরের নিষ্কাশনকে কোনও এক্সটেনশন ফাংশনে আবদ্ধ করতে পারেন।
যাইহোক, আমি এই উত্সের সমস্ত 3 দিকগুলিকে স্পর্শ করে এমন কোনও উত্স পাই না, সুতরাং এই পোস্টটি। আশা করি এটি কাউকে সাহায্য করবে!
বিটিডব্লিউ: এটি এএসপি। নেট কোর 3.1 ব্যবহার করছিল।