मुझे एएसपीएनटी एमवीसी 4.6 एप्लिकेशन को एएसपीनेट कोर 2.1 टन 1.0 से 2.0 और 2.0 में पोर्ट करने के बारे में अधिक जानकारी नहीं दिख रही है। 2.1 लेखों तक, लेकिन यह परिवर्तनों में थोड़ा सा कठोर है।

ठीक है, मैं पूरे Google और स्टैकओवरफ्लो पर रहा हूं और जो मैं कोशिश कर रहा हूं/करना चाहता हूं वह एक पुराने .net एप्लिकेशन को परिवर्तित कर देता है और इसे .net कोर में लाता है।

कुछ बड़े अपराधी जिन्हें मैं समस्या के रूप में देखता हूँ, वे निम्नलिखित हैं:

HttpContext.Current
HttpContext.Current.Request.Url.AbsolutePath
HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)
private static string CollectionToHtmlTable(HttpCookieCollection collection)

मैं इन लेखों को देख रहा था जो सहायक हैं, लेकिन वांछित होने के लिए बहुत कुछ है।

https://www.carlrippon.com/httpcontext-in-asp-net-core/ https://dotnetcoretutorials.com/2017/01/05/accessing-httpcontext-asp-net-core/

नियंत्रक के अंदर यह सबसे आसान लगता है, लेकिन इनमें से अधिकांश HttpContext.Current सामान विभिन्न स्थानों डोमेन पुस्तकालयों आदि के आसपास छिड़का हुआ है।

तो उपरोक्त दोनों url में ऐसा लगता है कि नीचे इस पंक्ति का उपयोग startup.cs हालांकि, मेरे पास मुख्य एएसपीनेट कोर के बाहर स्टार्टअप.सीएस नहीं है

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

फिर स्टार्टअप में भी मैंने यह लेख देखा https:/ /www.strathweb.com/2016/12/accessing-httpcontext-outside-of-framework-components-in-asp-net-core/

//one of many things added to project
services.AddHttpContextAccessor();

मुझे एहसास है कि पिछले कुछ वर्षों में कई प्रश्न पूछे गए हैं - यहां यह उम्मीद करना है कि किसी बहादुर आत्मा ने इस सामान की खोज की है और इस सामान को स्थानांतरित करने के बारे में कुछ सलाह/उत्तर हैं।

पोर्ट करने की विधि: #1

  public Service(string key, LogRecord.CallType callType, string operation, string opArg, string opResponse)
    {
        this.Key = string.IsNullOrEmpty(key)
                       ? HttpContext.Current != null ? "Inbound/WebHttp: " + HttpContext.Current.Request.Url.AbsolutePath : string.Empty
                       : key;
        this.CallType = Enum.GetName(typeof(LogRecord.CallType), callType);
        this.URL = HttpContext.Current != null && callType == LogRecord.CallType.WebHttp
                       ? HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)
                       : string.Empty;
        this.Operation = operation;
        this.OpArg = opArg;
        this.OpResponse = opResponse;
    }

दूसरा: #2

   private static string CollectionToHtmlTable(HttpCookieCollection collection)
    {
        // Converts HttpCookieCollection to NameValueCollection
        var nvc = new NameValueCollection();
        foreach (string item in collection)
        {
            var httpCookie = collection[item];
            if (httpCookie != null)
            {
                nvc.Add(item, httpCookie.Value);
            }
        }

        return CollectionToHtmlTable(nvc);
    }
2
user10189172 7 अगस्त 2018, 03:10
4
आप जो पूछ रहे हैं वह वास्तव में स्पष्ट नहीं है। क्या आप अन्य परियोजनाओं में कक्षाओं में HttpContextAccessor इंजेक्ट करना चाहते हैं? ध्यान दें कि HttpContext.Current को बहिष्कृत कर दिया गया था क्योंकि इसका बेतहाशा दुरुपयोग किया गया था, इसलिए आपको खुद से पूछना चाहिए कि क्या आपको वास्तव में इसकी आवश्यकता है
 – 
Camilo Terevinto
7 अगस्त 2018, 03:17
"हालांकि, मेरे पास मुख्य एएसपीनेट कोर के बाहर स्टार्टअप.सीएस नहीं है" - क्या वह नहीं है जिसे आप ढूंढ रहे हैं? IHttpContextAccessor और (संभवतः) IActionContextAcccessor का उपयोग करने में आपको क्या समस्या आ रही है?
 – 
Llama
7 अगस्त 2018, 03:17
अगर मैं किसी एप्लिकेशन को पोर्ट करना चाहता हूं - यूआरएल में इन हैक्स को मैंने विशेष रूप से स्ट्रैथवेब एक चिपकाया है, तो अनुरोध नहीं है। पथ - पिछले डेवलपर्स ने सेवाओं, सुरक्षा, त्रुटि लॉग पहचान इत्यादि के लिए लिखे गए सभी कोड के आधार पर आवश्यक है। .
 – 
user10189172
7 अगस्त 2018, 03:25
- एएसपीनेट में केवल स्टार्टअप.सीएस फ़ाइल है - हालांकि मैं कक्षा पुस्तकालयों में रहना चाहता हूं जिसमें उपरोक्त विधियां उपलब्ध नहीं हैं। अनिवार्य रूप से पोर्ट किए जाने की तलाश में
 – 
user10189172
7 अगस्त 2018, 03:27
1
क्या आप वर्तमान में निर्भरता इंजेक्शन का उपयोग करते हैं?
 – 
Llama
7 अगस्त 2018, 03:31

2 जवाब

सबसे बढ़िया उत्तर

समस्या यह है कि आप वर्तमान में इसका गलत उपयोग कर रहे हैं।

नियंत्रक के अंदर यह सबसे आसान लगता है, लेकिन इनमें से अधिकतर HttpContext.Current सामग्री विभिन्न स्थानों डोमेन पुस्तकालयों आदि के आसपास छिड़का हुआ है।

एक डोमेन लाइब्रेरी फ़्रंटएंड से स्वतंत्र होनी चाहिए। इससे कोई फर्क नहीं पड़ता कि यह सत्र या स्टेटफुल wpf ऐप वाली वेबसाइट है। या एक रेस्टफुल एपी।

उस ने कहा, एक रिश्तेदार त्वरित सुधार HttpContext को अपने डोमेन वर्ग में इंजेक्ट करें

public DomainService(IHttpContextAccessor httpContext)
{
    _httpContext = httpContext;
}

फिर आप निर्भरता इंजेक्शन के माध्यम से अपनी DomainService प्राप्त कर सकते हैं। यदि निर्माण जटिल है, तो आप एक Factory.

या आप अपने ActionMethod में स्वयं सेवा बना सकते हैं (बेशक इस मामले में आपको सेवा के निर्माता को HttpContext में बदलने की आवश्यकता है:

public IActionResult Foo()
{
    var service = new DomainService(HttpContext)
}

उसने कहा: इसे किसी कारण से हटा दिया गया था। कृपया अपने डोमेन में HttpContext पर भरोसा न करें! एक व्यावसायिक वस्तु बनाएं और इसके बजाय इसे डोमेन को पैरामीटर के रूप में दें।


सुनिश्चित नहीं है कि यह सबसे अच्छा तरीका है, लेकिन मैंने बिजनेस कॉन्टेक्स्ट क्लास बनाया है और इसे स्कोप के रूप में पंजीकृत किया है। आवश्यक डेटा के साथ इसे बनाने के लिए एक कारखाना जिम्मेदार है।


ऐसा न करें:

अगर आप वाकई पागल हैं, तो शायद यह a> प्रवासन में आपकी सहायता कर सकता है।

4
Community 20 जून 2020, 12:12
"कृपया अपने डोमेन में HttpContext पर भरोसा न करें"। मेरे मामले में मैं प्रत्येक डीबी कॉल में एक आईपी पता जोड़ना चाहता हूं, इसमें क्या गलत है? क्या मुझे प्रत्येक नियंत्रक पर आईपी पते एकत्र करने की आवश्यकता है?
 – 
Toolkit
7 मार्च 2020, 13:21
1
मेरा मतलब है, सीधे निर्भरता में इस पर भरोसा न करें। यदि आपको अपने डोमेन में आईपी पते की आवश्यकता है, तो एक ऐसी सेवा बनाएं जो आईपी पते (जैसे IBusinessContext को IpAdress {get;} के साथ परिवहन कर सके। जब आपके पास एक वेबसाइट होती है, तो एक कारखाना इसे आपके पर्यावरण के आधार पर बनाता है ( उदाहरण के लिए HttpContext। यह आपको एक wpf एप्लिकेशन से उसी डोमेन का उपयोग करने में सक्षम बनाता है, जहां आईपी किसी अन्य चीज़ से बनाया गया है, HttpContext की तुलना में। @Toolkit
 – 
Christian Gollhardt
11 मार्च 2020, 15:56

ओपी के अनुरोध पर इसे पोस्ट करना, इसलिए यह पूर्ण उत्तर नहीं है। आप यूआरआई को IHttpContextAccessor से इस प्रकार पुनर्निर्माण कर सकते हैं:

IHttpContextAccessor context; // injected
var request = context.HttpContext.Request;

var uriBuilder = new UriBuilder();
uriBuilder.Scheme = request.Scheme;
uriBuilder.Host = request.Host.Host;
if (request.Host.Port.HasValue)
{
    uriBuilder.Port = request.Host.Port.Value;
}
uriBuilder.Path = request.Path;
if (request.QueryString.HasValue)
{
    uriBuilder.Query = request.QueryString.Value.Substring(1);
}

var requestUri = uriBuilder.Uri;

इसी तरह, आप निम्न द्वारा IRequestCookieCollection तक पहुंच सकते हैं:

var collection = context.HttpContext.Request.Cookies
foreach (KeyValuePair<string, string> cookie in collection)
2
Llama 7 अगस्त 2018, 03:34
मुझे लगता है कि // injected वह हिस्सा है जो ओपी के लिए सबसे अधिक समस्या पैदा कर रहा है। मुझे पूरा यकीन है कि उन्हें लगता है कि वे asp.net कोर प्रोजेक्ट के बाहर DI कंटेनर तक नहीं पहुंच सकते हैं
 – 
Camilo Terevinto
7 अगस्त 2018, 03:36
मैंने एक टिप्पणी के साथ कोशिश की और जांच की लेकिन उस मोर्चे पर कोई जवाब नहीं मिला। जरूरत पड़ने पर थोड़ा अपडेट करेंगे।
 – 
Llama
7 अगस्त 2018, 03:37