কীভাবে ওয়েব এপিআই মেসেজ হ্যান্ডলারে কাস্টম শিরোনাম মান বের করতে হয়?


150

আমার বর্তমানে আমার ওয়েব এপিআই পরিষেবাদিতে একটি বার্তা হ্যান্ডলার রয়েছে যা 'সেন্ডআসেন্সিকে' নিম্নরূপে ওভাররাইড করে:

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
  //implementation
}

এই কোডের মধ্যে আমার কাস্টম অ্যাড রিকুয়েস্ট শিরোনাম মানটি পরিদর্শন করা দরকার MyCustomID। সমস্যাটি যখন আমি নিম্নলিখিতগুলি করি:

if (request.Headers.Contains("MyCustomID"))  //OK
    var id = request.Headers["MyCustomID"];  //build error - not OK

... আমি নিম্নলিখিত ত্রুটি বার্তা পেয়েছি:

'System.Net.Http.Heeda.HttpRequestHeeda' টাইপের অভিব্যক্তিটিতে [] এর সাথে সূচীকরণ প্রয়োগ করতে পারে না

এই ওভাররাইড পদ্ধতিতে পাস হওয়া ( এমএসডিএন ডকুমেন্টেশন ) উদাহরণের মাধ্যমে আমি কীভাবে একটি একক কাস্টম অনুরোধ শিরোনাম অ্যাক্সেস করতে পারি ?HttpRequestMessage


আপনি যদি ব্যবহার করছেন তবে কি হবে request.Headers.Get("MyCustomID");?
uididu

2
এখানে কোনও Get' on the HTTPRequestHeeda` টাইপ নেই। বার্তাটি: "প্রতীক 'পেতে' সমাধান করা যায় না" উত্পাদিত হয়।
এটকনওয়ে

উত্তর:


252

এরকম কিছু চেষ্টা করুন:

IEnumerable<string> headerValues = request.Headers.GetValues("MyCustomID");
var id = headerValues.FirstOrDefault();

শিরোনামে একটি ট্রাইগেটভ্যালু পদ্ধতি রয়েছে যা আপনি যদি সর্বদা হেডারটিতে অ্যাক্সেসের গ্যারান্টিযুক্ত না হন তবে আপনি ব্যবহার করতে পারেন।


26
গেটভ্যালুগুলির নাল চেক কোনও মান দেয় না কারণ এটি কখনই বাতিল হয় না। শিরোনামটি উপস্থিত না থাকলে আপনি একটি অবৈধ অপসারণের ধারণা পাবেন। আপনার ট্রাইগেটহাইডার্স ব্যবহার করা দরকার যদি এটি সম্ভব হয় তবে শিরোনামটি অনুরোধে উপস্থিত থাকতে পারে এবং একটি ভুল প্রতিক্রিয়া যাচাই করতে পারেন বা getValues ​​কলটির চারপাশে চেষ্টা করুন / প্রস্তাবিত নয়) not
ড্রু মার্শ

4
@ ড্র অনুরোধ.হিডার্স.সিংল (এইচ => এইচ। কে == "অনুমোদন"); অনেক কম কোড একই করছেন!
এলিজাবেথ

17
কেন শুধু নয়var id = request.Headers.GetValues("MyCustomID").FirstOrDefault();
গৌই

3
@ সাইদনেমতি কারণ শিরোনামের মানগুলি এক-এক নয়। আপনি একই অনুরোধে Some-Header: oneএবং তারপর পেতে পারেন Some-Header: two। কিছু ভাষা নিঃশব্দে "একটি" বাতিল করে দেয় তবে এটি ভুল। এটি আরএফসি-তে রয়েছে তবে এখন এটি খুঁজে পেতে আমি খুব অলস।
Cory মাওয়াহারপোর্টার

1
সা Saeedদের বক্তব্য বৈধ, ব্যবহারযোগ্যতা গুরুত্বপূর্ণ এবং সর্বাধিক সাধারণ ব্যবহারের ক্ষেত্রে হ'ল একটি অনুরোধ শিরোনামের জন্য একটি মান পুনরুদ্ধার করা। একটি অনুরোধ শিরোনামের জন্য একাধিক মান পুনরুদ্ধারের জন্য আপনার এখনও একটি getValues ​​অপারেশন থাকতে পারে (যা লোকেরা নিখুঁতভাবে ব্যবহার করবে), তবে 99% সময় তারা নির্দিষ্ট অনুরোধ শিরোনামের জন্য কেবল একটি মান পুনরুদ্ধার করতে চাইবে এবং এটি একটি হওয়া উচিত মাছ ধরার নৌকা।
জাস্টিন

39

throws exceptionকীটি উপস্থিত না থাকলে নীচের লাইনটি ।

IEnumerable<string> headerValues = request.Headers.GetValues("MyCustomID");

চারপাশে কাজ:

সিস্টেম অন্তর্ভুক্ত করুন। লিঙ্ক;

IEnumerable<string> headerValues;
var userId = string.Empty;

     if (request.Headers.TryGetValues("MyCustomID", out headerValues))
     {
         userId = headerValues.FirstOrDefault();
     }           

17

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

private T GetFirstHeaderValueOrDefault<T>(string headerKey, 
   Func<HttpRequestMessage, string> defaultValue, 
   Func<string,T> valueTransform)
    {
        IEnumerable<string> headerValues;
        HttpRequestMessage message = Request ?? new HttpRequestMessage();
        if (!message.Headers.TryGetValues(headerKey, out headerValues))
            return valueTransform(defaultValue(message));
        string firstHeaderValue = headerValues.FirstOrDefault() ?? defaultValue(message);
        return valueTransform(firstHeaderValue);
    }

এখানে ব্যবহারের একটি উদাহরণ রয়েছে:

GetFirstHeaderValueOrDefault("X-MyGuid", h => Guid.NewGuid().ToString(), Guid.Parse);

আরও সাধারণ সমাধানের জন্য @ দোগুহান-উলুকার জবাব দেখুন।


1
Funcএবং Actionজেনেরিক প্রতিনিধি স্বাক্ষর কনস্ট্রাক্টসগুলি নেট নেট এবং তার উপরে 3.5 এর মধ্যে নির্মিত। আমি পদ্ধতিটি সম্পর্কে সুনির্দিষ্ট প্রশ্নগুলি নিয়ে আলোচনা করে খুশি হব, তবে আমি প্রথমে সেগুলি সম্পর্কে শেখার পরামর্শ দেব।
নিওন্টাপির

1
@Nontapir (এবং অন্যান্য) দ্বিতীয় প্যারামিটারটি কী না পাওয়া গেলে একটি ডিফল্ট মান সরবরাহ করতে ব্যবহৃত হয়। তৃতীয় প্যারামিটারটি প্রত্যাশিত প্রকারের প্রত্যাবর্তন মানকে 'রূপান্তর' করতে ব্যবহৃত হয় যা প্রত্যাবর্তনযোগ্য টাইপটি নির্দিষ্ট করে। উদাহরণস্বরূপ, যদি 'এক্স-মাইগুইড' না পাওয়া যায় তবে পরামিতি 2 ল্যাম্বদা মূলত একটি স্ট্রিং হিসাবে একটি ডিফল্ট গাইড সরবরাহ করে (এটি শিরোনাম থেকে পুনরুদ্ধার করা হত) এবং গাইড। পার্স তৃতীয় প্যারামিটারটি পাওয়া বা ডিফল্ট স্ট্রিংয়ের মান অনুবাদ করবে একটি গাইডের মধ্যে।
মাইকি

@neontapir এই ফাংশনটিতে অনুরোধটি কোথা থেকে আসছে? (এবং যদি এটি নাল হয় তবে কীভাবে একটি নতুন এইচটিটিপিআরকুয়েস্টম্যাসেজ () এর কোনও শিরোনাম থাকবে? অনুরোধটি বাতিল হলে কেবল ডিফল্ট মানটি
ফেরাতে

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

@ editel, neontapir আমি উপরের স্নিপেটটি ব্যবহার করার চেষ্টা করেছি এবং আমি বিশ্বাস করি যে পদ্ধতিটির মূল অংশের 2 লাইনটিতে "অনুরোধ" হয় হয় পদ্ধতিযুক্ত শ্রেণীর একটি ব্যক্তিগত ক্ষেত্র হতে হবে বা প্যারামিটার হিসাবে পাস করা উচিত (এইচটিটিপিআরকোয়েস্টমেজেজ টাইপ করুন) পদ্ধতি
সুধাংশু মিশ্র

12

একটি নতুন পদ্ধতি তৈরি করুন - ' একটি পৃথক এইচটিটিপি শিরোলেখের মান ফেরত দেয় ' এবং যখন এইচটিটিপিআরকুয়েস্টমেসেজ থেকে একাধিক কী মানগুলিতে অ্যাক্সেস করার দরকার হয় তখন প্রতিটি সময় কী মান সহ এই পদ্ধতিটি কল করুন।

public static string GetHeader(this HttpRequestMessage request, string key)
        {
            IEnumerable<string> keys = null;
            if (!request.Headers.TryGetValues(key, out keys))
                return null;

            return keys.First();
        }

মাইকাস্টমআইডি যদি অনুরোধের অংশ না হয় তবে .. এটি নাল ব্যতিক্রম প্রত্যাখ্যান করে।
প্রসাদ কানাপার্থী

10

@ নিউন্টাপিরের সমাধানটিতে আরও প্রসারিত করতে এখানে আরও একটি জেনেরিক সমাধান দেওয়া হয়েছে যা HttpRequestMessage বা HttpResponseMessage কে সমানভাবে প্রয়োগ করতে পারে এবং হ্যান্ড কোডড এক্সপ্রেশন বা ফাংশনগুলির প্রয়োজন হয় না।

using System.Net.Http;
using System.Collections.Generic;
using System.Linq;

public static class HttpResponseMessageExtensions
{
    public static T GetFirstHeaderValueOrDefault<T>(
        this HttpResponseMessage response,
        string headerKey)
    {
        var toReturn = default(T);

        IEnumerable<string> headerValues;

        if (response.Content.Headers.TryGetValues(headerKey, out headerValues))
        {
            var valueString = headerValues.FirstOrDefault();
            if (valueString != null)
            {
                return (T)Convert.ChangeType(valueString, typeof(T));
            }
        }

        return toReturn;
    }
}

নমুনা ব্যবহার:

var myValue = response.GetFirstHeaderValueOrDefault<int>("MyValue");

দেখতে দুর্দান্ত দেখাচ্ছে তবে GetFirstHeaderValueOrDefaultদুটি প্যারামিটার রয়েছে, সুতরাং নমুনার ব্যবহার হিসাবে কল করার সময় এটি পরম অনুপস্থিত হওয়ার বিষয়ে অভিযোগ করে var myValue = response.GetFirstHeaderValueOrDefault<int>("MyValue");আমি কি কিছু মিস করছি?
Jeb50

অনুরোধের জন্য প্রতিক্রিয়া প্রতিস্থাপন করে নতুন স্থিতিশীল শ্রেণি যুক্ত করা হয়েছে। এপিআই কন্ট্রোলার থেকে আহ্বান করা হয়েছে, যেমনটি var myValue = myNameSpace.HttpRequestMessageExtension.GetFirstHeaderValueOrDefault<int>("productID");পাওয়া যায়নি এমন কোনও যুক্তি নেই যা 'এইচটিপিআরকিস্টম্যাসেজএক্সটেনশন.GetFirstHeaderValueOrDefault <T> (HttpRequestMessage, স্ট্রিং)'
Jeb50

@ Jeb50 আপনি using HttpResponseMessageExtensionsযে ফাইলটি এই এক্সটেনশনটি ব্যবহার করার চেষ্টা করছেন সে বিষয়ে আপনি কি ঘোষণা করছেন?
ডোগুহান উলুকা

4

এএসপি.নেট কোরের জন্য যদি নিয়ামক পদ্ধতিতে সরাসরি পরম ব্যবহার করতে চান তবে একটি সহজ সমাধান রয়েছে: [ফ্রিহাইডার] টীকাটি ব্যবহার করুন।

        public JsonResult SendAsync([FromHeader] string myParam)
        {
        if(myParam == null)  //Param not set in request header
        {
           return null;
        }
        return doSomething();
    }   

অতিরিক্ত তথ্য: আমার ক্ষেত্রে "মাইপ্রাম" একটি স্ট্রিং হওয়া উচিত, সর্বদা 0 ছিল।


4

এএসপি.এনইটি-র জন্য আপনি এই সাধারণ লাইব্রেরি / প্যাকেজটি ব্যবহার করে নিয়ামক পদ্ধতিতে প্যারামিটার থেকে সরাসরি হেডার পেতে পারেন । এটি [FromHeader]এএসপি.নেট কোর :) এর মতো একটি বৈশিষ্ট্য সরবরাহ করে । উদাহরণ স্বরূপ:

    ...
    using RazHeaderAttribute.Attributes;

    [Route("api/{controller}")]
    public class RandomController : ApiController 
    {
        ...
        // GET api/random
        [HttpGet]
        public IEnumerable<string> Get([FromHeader("pages")] int page, [FromHeader] string rows)
        {
            // Print in the debug window to be sure our bound stuff are passed :)
            Debug.WriteLine($"Rows {rows}, Page {page}");
            ...
        }
    }

4

এক লাইন সমাধান

var id = request.Headers.GetValues("MyCustomID").FirstOrDefault();

মাইকাস্টমআইডি যদি অনুরোধের অংশ না হয় তবে .. এটি নাল ব্যতিক্রম প্রত্যাখ্যান করে।
প্রসাদ কানাপার্থী

1
@PrasadKanaparthi তারপর তোমার মত অন্য উত্তর ব্যবহার করা উচিত stackoverflow.com/a/25640256/4275342 । আপনি দেখতে কোন নাল চেক আছে, তাই হয়, কি requestহয় null? এটাও সম্ভব। বা যদি MyCustomIDখালি স্ট্রিং হয় বা এর সমান হয় না foo? এটি প্রসঙ্গে নির্ভর করে, সুতরাং এই উত্তরটি কেবল
উপায়টি

আপনি কি সম্মত হন না যে কোডটি কাজ করছে এবং শিরোনামের মানটি ফিরিয়ে দিতে পারে?
রোমান মারুসাইক

1
এটি দুর্দান্ত কাজ করে .. যদি "মাই কাস্টমআইডি" অনুরোধের অনুরোধের অংশ হয়। হ্যাঁ, সমস্ত বৈধকরণের যত্ন নেওয়া দরকার
প্রসাদ কানাপার্থী

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.