আমি কীভাবে এইচটিটিপিআরকুয়েস্টবেসকে এইচটিটিপিআরকেয়েস্ট অবজেক্টে রূপান্তর করব?


89

আমার এএসপি.নেট এমভিসি কন্ট্রোলারের অভ্যন্তরে, আমি একটি পদ্ধতি পেয়েছি যার জন্য কোনও HttpRequestবস্তুর প্রয়োজন requires আমার যে সমস্ত অ্যাক্সেস আছে তা হ'ল একটি HttpRequestBaseঅবজেক্ট।

আমি কি কোনওভাবে এটি রূপান্তর করতে পারি?

আমি কি করতে পারি / করব ??


4
নোট: এই প্রশ্নের 'বিপরীত' এখানে stackoverflow.com/questions/15275370/...
Simon_Weaver

উত্তর:


50

এটি কি আপনার পদ্ধতি, যাতে আপনি এটি নিতে আবার লিখতে পারেন HttpRequestBase? যদি তা না হয়, আপনি সবসময় বর্তমান পেতে পারেন HttpRequestথেকে HttpContext.Current.HttpRequestউপর পাস। যাইহোক, আমি প্রায়শই এইএসপি.নেট-তে উল্লিখিত ক্লাসের মধ্যে এইচটিপিপেক্সটেক্সট এ অ্যাক্সেস মোড়ানো করি : ভাল ইউনিট পরীক্ষার সহায়তার জন্য সিস্টেম সরানো হচ্ছে। ওয়েব নির্ভরতা


4
বিব্রতকরভাবে, আমি এটিও ভেবেছিলাম এবং এটি কার্যকর হয় না। এইচটিটিপি কনটেক্সটটি এমভিসি প্রসঙ্গ .. সুতরাং এতে কোনও 'কারেন্ট' সম্পত্তি প্রকাশিত হয়নি। আমি নিশ্চিত না কীভাবে 'ওল্ডস্কুল' এইচটিটিপি কনটেক্সট.কন্ট্রনে অ্যাক্সেস পাবেন ... ???
খাঁটি.ক্রোম

48
আপনি কন্ট্রোলার সদস্যের পরিবর্তে এইচটিটিপি কনটেক্সট ক্লাসটি ধরছেন তা নিশ্চিত হতে, System.Web.HttpContext.Current ব্যবহার করে চেষ্টা করুন।
কেভিন হাকানসন

4
আমার পুরো নেমস্পেসটি ব্যবহার করা দরকার কারণ এটি বর্তমান এমভিসি নেমস্পেসের সম্পত্তি নিচ্ছে। চিয়ার্স অন্যকে লক্ষ্য করুন: আমি যা করছি তা করো না। এটি একটি খুববেডথিং (টিএম)।
বিশুদ্ধ.ক্রোম

লিঙ্কটি মারা গেছে; ডেভেলপমেন্টালমডনেস.কম ডোমেনের মেয়াদ শেষ হয়েছে, GoDaddy ফিলার পৃষ্ঠা এখন
ক্রিস মোসচিনি

4
System.Web.HttpContext.Current.Request
Balla

72

আপনার অ্যাপ্লিকেশনটিতে সর্বদা আপনার HTTPRequestBase এবং HttpResponseBase ব্যবহার করা উচিত কংক্রিট সংস্করণগুলির বিপরীতে যা পরীক্ষা করা অসম্ভব (টাইপমক বা অন্য কোনও যাদু ছাড়াই)।

নীচের মত বর্ণিত রূপান্তর করতে কেবল এইচটিটিপিআরকুয়েস্টওয়্যার্পার ক্লাসটি ব্যবহার করুন ।

var httpRequestBase = new HttpRequestWrapper(Context.Request);

4
আরেকটি দয়া করে মনে রাখবেন না শুধুমাত্র ব্যবহার HttpRequestBaseএবং HttpResponseBase, এছাড়াও HttpContextBase। :)
জুনে লি

এটি ভুল দিকে রূপান্তরিত। প্রশ্নটি ছিল: আমার যদি একটি থাকে তবে আমি HttpRequestBaseকীভাবে এটি থেকে প্রকৃত পেতেHttpRequest পারি?
সানকাট 2000

30

আপনি শুধু ব্যবহার করতে পারেন

System.Web.HttpContext.Current.Request

এখানে মূল কীটি হ'ল "সঠিক" এইচটিপিপেক্সটেক্সট এ যেতে আপনার পুরো নামস্থান প্রয়োজন।

আমি জানি এই প্রশ্নটি জিজ্ঞাসা করার পরে 4 বছর হয়ে গেছে, তবে এটি যদি কাউকে সহায়তা করে তবে আপনি এখানে যান!

(সম্পাদনা করুন: আমি দেখতে পাচ্ছি কেভিন হাকানসন ইতিমধ্যে এই উত্তরটি দিয়েছেন ... সুতরাং আশা করি আমার প্রতিক্রিয়া সেই ব্যক্তিদের সহায়তা করবে যারা কেবল উত্তরগুলি পড়ে না এবং মন্তব্য নয়।))


9

আপনার এইচটিটিপিআরকুয়েস্টবেস ব্যবহার করে একটি HTTPRequestWrapper ব্যবহার / তৈরি করার চেষ্টা করুন।


9

ASP.NET MVC4 .NET 4.5 এ এইচটিটিপিআরকেস্ট পেতে আপনি নিম্নলিখিতটি করতে পারেন:

this.HttpContext.ApplicationInstance.Context.Request

4

সাধারণত যখন আপনার HttpContextকোনও নিয়ামক পদক্ষেপে সম্পত্তিটি অ্যাক্সেস করার প্রয়োজন হয় , তখন এমন কিছু জিনিস রয়েছে যা আপনি ভাল ডিজাইন অনুযায়ী করতে পারেন।

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


সম্পূর্ণ একমত! সমস্যা হল, আমি বর্তমান বর্গ গ্রন্থাগার আমরা ব্যবহার করতে হয় সংশোধন করতে পারবেন না .. তাই এই আমাকে অনেক সাহায্য না :(
Pure.Krome

2

এই ধরণের মধ্যে রূপান্তর করার কোনও উপায় নেই।

আমাদেরও একই ঘটনা ছিল। আমরা আমাদের ক্লাস / ওয়েব পরিষেবাদি পদ্ধতিগুলি পুনর্লিখন করেছিলাম যাতে তারা "বেস" প্রত্যয় (HttpContext, ... এইচটিটিপিসেশনস্টেট) ব্যতীত বন্ধ নামের নামের পরিবর্তে এইচটিটিপি কনটেক্সটবেস, এইচটিটিপি অ্যাপ্লিকেশনস্টেটবেস, এইচটিপিএসসার্টি ইউটিলিটিবেস, এইচটিটিপিএসশনস্টেটবেস ব্যবহার করে। এগুলি ঘরে তৈরি উপহাসের সাথে পরিচালনা করা অনেক সহজ।

আমি দুঃখিত আপনি এটি করতে পারেন না।


4
সত্য নয় vvar httpRequest = Context.Request; var httpRequestBase = নতুন HttpRequestWrapper (প্রসঙ্গ .Request);
কাউন্টজেরো

2

এটি একটি এএসপি.নেট এমভিসি 3.0 এসিঙ্ককন্ট্রোলার যা অনুরোধগুলি গ্রহণ করে, অভ্যন্তরীণ এইচটিটিপিআরকুয়েস্টবেস এমভিসি অবজেক্টকে একটি সিস্টেম.ওয়েব.এইচটিপিওয়েব্রেকয়েস্টে রূপান্তর করে। এরপরে এটি অনুরোধটি সংযোজিতভাবে প্রেরণ করে। প্রতিক্রিয়া ফিরে এলে, এটি সিস্টেম.ওয়েব.এইচটিপিওয়েব্রেসপন্সকে আবার এমভিসি এইচটিপিআরএসপোনসবেজে পরিণত করে যা এমভিসি নিয়ন্ত্রকের মাধ্যমে ফিরে পাওয়া যায়।

এই প্রশ্নের সুস্পষ্ট উত্তর দেওয়ার জন্য, আমি অনুমান করি আপনি কেবল বিল্ডউইব্রেকয়েস্ট () ফাংশনে আগ্রহী হবেন। তবে, এটি দেখায় যে কীভাবে পুরো পাইপলাইনটি সরানো যায় - বেসরেক্সেস্ট> অনুরোধ এবং তারপরে প্রতিক্রিয়া> বেসরেস্পোনস থেকে রূপান্তর। আমি ভেবেছিলাম উভয় ভাগ করে নেওয়া দরকারী হবে।

এই ক্লাসগুলির মাধ্যমে, আপনার কাছে একটি এমভিসি সার্ভার থাকতে পারে যা ওয়েব প্রক্সি হিসাবে কাজ করে।

আশাকরি এটা সাহায্য করবে!

নিয়ামক:

[HandleError]
public class MyProxy : AsyncController
{
    [HttpGet]
    public void RedirectAsync()
    {
        AsyncManager.OutstandingOperations.Increment();

        var hubBroker = new RequestBroker();
        hubBroker.BrokerCompleted += (sender, e) =>
        {
            this.AsyncManager.Parameters["brokered"] = e.Response;
            this.AsyncManager.OutstandingOperations.Decrement();
        };

        hubBroker.BrokerAsync(this.Request, redirectTo);
   }

    public ActionResult RedirectCompleted(HttpWebResponse brokered)
    {
        RequestBroker.BuildControllerResponse(this.Response, brokered);
        return new HttpStatusCodeResult(Response.StatusCode);
    }
}

এটি প্রক্সি ক্লাস যা ভারী উত্তোলন করে:

namespace MyProxy
{
    /// <summary>
    /// Asynchronous operation to proxy or "broker" a request via MVC
    /// </summary>
    internal class RequestBroker
    {
        /*
         * HttpWebRequest is a little protective, and if we do a straight copy of header information we will get ArgumentException for a set of 'restricted' 
         * headers which either can't be set or need to be set on other interfaces. This is a complete list of restricted headers.
         */
        private static readonly string[] RestrictedHeaders = new string[] { "Accept", "Connection", "Content-Length", "Content-Type", "Date", "Expect", "Host", "If-Modified-Since", "Range", "Referer", "Transfer-Encoding", "User-Agent", "Proxy-Connection" };

        internal class BrokerEventArgs : EventArgs
        {
            public DateTime StartTime { get; set; }

            public HttpWebResponse Response { get; set; }
        }

        public delegate void BrokerEventHandler(object sender, BrokerEventArgs e);

        public event BrokerEventHandler BrokerCompleted;

        public void BrokerAsync(HttpRequestBase requestToBroker, string redirectToUrl)
        {
            var httpRequest = BuildWebRequest(requestToBroker, redirectToUrl);

            var brokerTask = new Task(() => this.DoBroker(httpRequest));
            brokerTask.Start();
        }

        private void DoBroker(HttpWebRequest requestToBroker)
        {
            var startTime = DateTime.UtcNow;

            HttpWebResponse response;
            try
            {
                response = requestToBroker.GetResponse() as HttpWebResponse;
            }
            catch (WebException e)
            {
                Trace.TraceError("Broker Fail: " + e.ToString());

                response = e.Response as HttpWebResponse;
            }

            var args = new BrokerEventArgs()
            {
                StartTime = startTime,
                Response = response,
            };

            this.BrokerCompleted(this, args);
        }

        public static void BuildControllerResponse(HttpResponseBase httpResponseBase, HttpWebResponse brokeredResponse)
        {
            if (brokeredResponse == null)
            {
                PerfCounters.ErrorCounter.Increment();

                throw new GriddleException("Failed to broker a response. Refer to logs for details.");
            }

            httpResponseBase.Charset = brokeredResponse.CharacterSet;
            httpResponseBase.ContentType = brokeredResponse.ContentType;

            foreach (Cookie cookie in brokeredResponse.Cookies)
            {
                httpResponseBase.Cookies.Add(CookieToHttpCookie(cookie));
            }

            foreach (var header in brokeredResponse.Headers.AllKeys
                .Where(k => !k.Equals("Transfer-Encoding", StringComparison.InvariantCultureIgnoreCase)))
            {
                httpResponseBase.Headers.Add(header, brokeredResponse.Headers[header]);
            }

            httpResponseBase.StatusCode = (int)brokeredResponse.StatusCode;
            httpResponseBase.StatusDescription = brokeredResponse.StatusDescription;

            BridgeAndCloseStreams(brokeredResponse.GetResponseStream(), httpResponseBase.OutputStream);
        }

        private static HttpWebRequest BuildWebRequest(HttpRequestBase requestToBroker, string redirectToUrl)
        {
            var httpRequest = (HttpWebRequest)WebRequest.Create(redirectToUrl);

            if (requestToBroker.Headers != null)
            {
                foreach (var header in requestToBroker.Headers.AllKeys)
                {
                    if (RestrictedHeaders.Any(h => header.Equals(h, StringComparison.InvariantCultureIgnoreCase)))
                    {
                        continue;
                    }                   

                    httpRequest.Headers.Add(header, requestToBroker.Headers[header]);
                }
            }

            httpRequest.Accept = string.Join(",", requestToBroker.AcceptTypes);
            httpRequest.ContentType = requestToBroker.ContentType;
            httpRequest.Method = requestToBroker.HttpMethod;

            if (requestToBroker.UrlReferrer != null)
            {
                httpRequest.Referer = requestToBroker.UrlReferrer.AbsoluteUri;
            }

            httpRequest.UserAgent = requestToBroker.UserAgent;

            /* This is a performance change which I like.
             * If this is not explicitly set to null, the CLR will do a registry hit for each request to use the default proxy.
             */
            httpRequest.Proxy = null;

            if (requestToBroker.HttpMethod.Equals("POST", StringComparison.InvariantCultureIgnoreCase))
            {
                BridgeAndCloseStreams(requestToBroker.InputStream, httpRequest.GetRequestStream());
            }

            return httpRequest;
        }

        /// <summary>
        /// Convert System.Net.Cookie into System.Web.HttpCookie
        /// </summary>
        private static HttpCookie CookieToHttpCookie(Cookie cookie)
        {
            HttpCookie httpCookie = new HttpCookie(cookie.Name);

            foreach (string value in cookie.Value.Split('&'))
            {
                string[] val = value.Split('=');
                httpCookie.Values.Add(val[0], val[1]);
            }

            httpCookie.Domain = cookie.Domain;
            httpCookie.Expires = cookie.Expires;
            httpCookie.HttpOnly = cookie.HttpOnly;
            httpCookie.Path = cookie.Path;
            httpCookie.Secure = cookie.Secure;

            return httpCookie;
        }

        /// <summary>
        /// Reads from stream into the to stream
        /// </summary>
        private static void BridgeAndCloseStreams(Stream from, Stream to)
        {
            try
            {
                int read;
                do
                {
                    read = from.ReadByte();

                    if (read != -1)
                    {
                        to.WriteByte((byte)read);
                    }
                }
                while (read != -1);
            }
            finally 
            {
                from.Close();
                to.Close();
            }
        }
    }
}

1

এটি কেভিনের মতো বলে কাজ করেছিল।

আমি পুনরুদ্ধার করার জন্য একটি স্থিতিশীল পদ্ধতি ব্যবহার করছি HttpContext.Current.Requestএবং তাই HttpRequestযখন প্রয়োজন হয় তখন সর্বদা ব্যবহারের জন্য কোনও বস্তু থাকে।

এখানে ক্লাস সহায়ক

public static HttpRequest GetRequest()
{
    return HttpContext.Current.Request;
}

এখানে নিয়ামক

if (AcessoModel.UsuarioLogado(Helper.GetRequest()))

এখানে দেখুন

bool bUserLogado = ProjectNamespace.Models.AcessoModel.UsuarioLogado(
                      ProjectNamespace.Models.Helper.GetRequest()
                   );

if (bUserLogado == false) { Response.Redirect("/"); }

আমার পদ্ধতি ইউসারিও লোগাডো

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