ASP.NET MVC और IIS7 में कच्चे HTTP अनुरोध / प्रतिक्रिया लॉग करना


141

मैं एक वेब सेवा (ASP.NET MVC का उपयोग करके) लिख रहा हूं और समर्थन उद्देश्यों के लिए हम कच्चे, ऑन-द-वायर प्रारूप (यानी HTTP सहित) के रूप में संभव के रूप में अनुरोधों और प्रतिक्रिया को लॉग करने में सक्षम होना चाहते हैं एक डेटाबेस में विधि, पथ, सभी हेडर और बॉडी)।

मुझे यकीन नहीं है कि कम से कम 'मैंगल्ड' तरीके से इस डेटा को कैसे प्राप्त किया जाए। मैं पुनः विश्वास कर सकता हूं कि मेरा मानना ​​है कि अनुरोध HttpRequestवस्तु के सभी गुणों का निरीक्षण करके और उनसे एक स्ट्रिंग का निर्माण करके (और इसी तरह प्रतिक्रिया के लिए) दिखता है, लेकिन मैं वास्तव में वास्तविक अनुरोध / प्रतिक्रिया डेटा को पकड़ना चाहता हूं। तार पर भेजा।

मैं किसी भी अवरोधन तंत्र जैसे कि फिल्टर, मॉड्यूल आदि का उपयोग करके खुश हूं और समाधान IIS7 के लिए विशिष्ट हो सकता है। हालाँकि, मैं इसे केवल प्रबंधित कोड में रखना पसंद करूँगा।

कोई सिफारिशें?

संपादित करें: मैंने नोट किया है कि HttpRequestएक ऐसा SaveAsतरीका है जो डिस्क को अनुरोध को बचा सकता है लेकिन यह आंतरिक सहायक विधियों के भार का उपयोग करके आंतरिक स्थिति से अनुरोध को फिर से संगठित करता है जिसे सार्वजनिक रूप से एक्सेस नहीं किया जा सकता है (काफी यही कारण है कि यह उपयोगकर्ता को प्रदान करने की अनुमति नहीं देता है धारा मुझे नहीं पता)। इसलिए ऐसा लगने लगा है कि मुझे वस्तुओं से अनुरोध / प्रतिक्रिया पाठ को फिर से संगठित करने के लिए अपनी पूरी कोशिश करनी होगी ... कराहना।

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

संपादित करें 3: क्या कोई भी इधर-उधर के सवालों को नहीं पढ़ता है? पांच जवाब अब तक और पूरे कच्चे ऑन द वायर अनुरोध को प्राप्त करने के लिए एक तरह से संकेत भी नहीं है। हां, मुझे पता है कि मैं आउटपुट स्ट्रीम और हेडर और URL और उस सभी सामान को अनुरोध ऑब्जेक्ट से कैप्चर कर सकता हूं। मैंने पहले ही कहा था कि प्रश्न में देखें:

मैं पुनः विश्वास कर सकता हूं कि मेरा मानना ​​है कि अनुरोध HttpRequest ऑब्जेक्ट की सभी संपत्तियों का निरीक्षण करके और उनसे एक स्ट्रिंग का निर्माण (और इसी तरह प्रतिक्रिया के लिए) करता है, लेकिन मैं वास्तव में वास्तविक अनुरोध / प्रतिक्रिया डेटा प्राप्त करना चाहता हूं यह तार पर भेजा गया है।

यदि आप पूरा कच्चा डेटा (हेडर, यूआरएल, http विधि, आदि सहित) जानते हैं, तो इसे पुनः प्राप्त नहीं किया जा सकता है, तो यह जानना उपयोगी होगा। इसी तरह यदि आप जानते हैं कि इसे कच्चे प्रारूप में कैसे प्राप्त किया जा सकता है (हां, मेरा अब भी मतलब है जिसमें हेडर, यूआरएल, http विधि, आदि शामिल हैं) इसे फिर से बनाए बिना, जो मैंने पूछा है, तो वह बहुत उपयोगी होगा। लेकिन मुझे यह बताना कि मैं इसे HttpRequest/ HttpResponseऑब्जेक्ट्स से फिर से बना सकता हूं उपयोगी नहीं है। मुझे पता है। मैंने पहले ही कहा था।


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


1
@ केव - नहीं, यह ASP.NET MVC का उपयोग करके लागू की गई एक RESTful सेवा है
Greg Beech

संभवतः IIS7 और एक देशी मॉड्यूल का उपयोग करना संभव है - msdn.microsoft.com/en-us/library/ms694280.aspx
डैनियल

क्या आप इसे लागू करने में कामयाब रहे हैं? बस जिज्ञासु, क्या आपने db लिखने के लिए कोई बफर रणनीति अपनाई?
systempuntoout 14

1
दिलचस्प परियोजना ... यदि आप इसे अंतिम समाधान के साथ कर रहे हैं?
प्रीग्टनटनकोजेरो कैब्रोन

जवाबों:


91

निश्चित रूप से एक का उपयोग IHttpModuleकरें BeginRequestऔर EndRequestघटनाओं और घटनाओं को लागू करें ।

सभी "कच्चे" डेटा के बीच मौजूद है HttpRequestऔर HttpResponse, यह सिर्फ एक ही कच्चे प्रारूप में नहीं है। यहाँ फ़िडलर-स्टाइल डंप बनाने के लिए आवश्यक भागों (कच्चे HTTP के करीब के रूप में इसे मिलता है):

request.HttpMethod + " " + request.RawUrl + " " + request.ServerVariables["SERVER_PROTOCOL"]
request.Headers // loop through these "key: value"
request.InputStream // make sure to reset the Position after reading or later reads may fail

प्रतिक्रिया के लिए:

"HTTP/1.1 " + response.Status
response.Headers // loop through these "key: value"

ध्यान दें कि आप प्रतिक्रिया स्ट्रीम नहीं पढ़ सकते हैं इसलिए आपको आउटपुट स्ट्रीम में एक फ़िल्टर जोड़ना होगा और एक कॉपी कैप्चर करनी होगी।

अपने में BeginRequest, आपको एक प्रतिक्रिया फ़िल्टर जोड़ना होगा:

HttpResponse response = HttpContext.Current.Response;
OutputFilterStream filter = new OutputFilterStream(response.Filter);
response.Filter = filter;

स्टोर करें filterजहां आप इसे EndRequestहैंडलर में प्राप्त कर सकते हैं । में सुझाव देता हूँ HttpContext.Items। तब पूर्ण प्रतिक्रिया डेटा प्राप्त कर सकते हैं filter.ReadStream()

फिर OutputFilterStreamएक धारा के चारों ओर आवरण के रूप में डेकोरेटर पैटर्न का उपयोग करके लागू करें:

/// <summary>
/// A stream which keeps an in-memory copy as it passes the bytes through
/// </summary>
public class OutputFilterStream : Stream
{
    private readonly Stream InnerStream;
    private readonly MemoryStream CopyStream;

    public OutputFilterStream(Stream inner)
    {
        this.InnerStream = inner;
        this.CopyStream = new MemoryStream();
    }

    public string ReadStream()
    {
        lock (this.InnerStream)
        {
            if (this.CopyStream.Length <= 0L ||
                !this.CopyStream.CanRead ||
                !this.CopyStream.CanSeek)
            {
                return String.Empty;
            }

            long pos = this.CopyStream.Position;
            this.CopyStream.Position = 0L;
            try
            {
                return new StreamReader(this.CopyStream).ReadToEnd();
            }
            finally
            {
                try
                {
                    this.CopyStream.Position = pos;
                }
                catch { }
            }
        }
    }


    public override bool CanRead
    {
        get { return this.InnerStream.CanRead; }
    }

    public override bool CanSeek
    {
        get { return this.InnerStream.CanSeek; }
    }

    public override bool CanWrite
    {
        get { return this.InnerStream.CanWrite; }
    }

    public override void Flush()
    {
        this.InnerStream.Flush();
    }

    public override long Length
    {
        get { return this.InnerStream.Length; }
    }

    public override long Position
    {
        get { return this.InnerStream.Position; }
        set { this.CopyStream.Position = this.InnerStream.Position = value; }
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        return this.InnerStream.Read(buffer, offset, count);
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        this.CopyStream.Seek(offset, origin);
        return this.InnerStream.Seek(offset, origin);
    }

    public override void SetLength(long value)
    {
        this.CopyStream.SetLength(value);
        this.InnerStream.SetLength(value);
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        this.CopyStream.Write(buffer, offset, count);
        this.InnerStream.Write(buffer, offset, count);
    }
}

1
अच्छा उत्तर। एक टिप्पणी हालांकि: आपने कहा था कि "फ़िल्टर में पूर्ण प्रतिक्रिया डेटा मिल सकता है। StString ()।" -तुम फिल्टर का मतलब नहीं। ReadStream ()? (मैं vb.net में कार्यान्वित कर रहा हूँ c # नहीं, लेकिन अगर मैं ToString चलाता हूं तो मुझे बस एक स्ट्रिंग के रूप में वर्ग का नाम मिलता है ।ReadStream वांछित प्रतिक्रिया निकाय देता है।
एडम

मैं सहमत हूं, अच्छा जवाब। मैंने इसे एक कस्टम लकड़हारे के लिए आधार के रूप में उपयोग किया है, लेकिन अब एक समस्या आई है जहां कुछ हेडर गायब हैं और सबसे महत्वपूर्ण बात यह है कि जब आईआईएस संपीड़न का उपयोग करते हुए मैं अंतिम संपीड़ित प्रतिक्रिया तक नहीं पहुंच सकता। मैंने इसके लिए एक नया संबंधित प्रश्न ( stackoverflow.com/questions/11084459/… ) शुरू किया।
क्रिस

2
मुझे लगता है कि mckamey एक जीनियस है। क्या आप Microsoft के लिए काम कर सकते हैं ताकि हम शानदार समाधानों की आवश्यकता के बजाय सिर्फ बुद्धिमान समाधान प्राप्त करें?
अबेकस

4
उस अनुरोध से सावधान रहें। RawUrl एक अनुरोध सत्यापन अपवाद को ट्रिगर कर सकता है। 4.5 में आप इसे रोकने के लिए request.Unvalidated.RawUrl का उपयोग कर सकते हैं। 4.0 में मैंने कुछ रिक्वेस्ट का उपयोग करके
मिमिकिक

1
@mckamey मैं अपने समाधान को अपने वैश्विक रूप में लागू करने का प्रयास करता हूं। Application_BeginRequest और Application_EndRequest के साथ अपने वैश्यालय में। लेकिन मुझे यकीन नहीं है कि मुझे EndRequest में कौन सा कोड लिखना चाहिए, क्या आप अपने उत्तर plz में एक उदाहरण प्रदान कर सकते हैं?
जेरोम 2606

48

HttpRequest पर निम्न विस्तार विधि एक स्ट्रिंग बनाएगी जिसे फ़िडलर में चिपकाया जा सकता है और फिर से दोहराया जा सकता है।

namespace System.Web
{
    using System.IO;

    /// <summary>
    /// Extension methods for HTTP Request.
    /// <remarks>
    /// See the HTTP 1.1 specification http://www.w3.org/Protocols/rfc2616/rfc2616.html
    /// for details of implementation decisions.
    /// </remarks>
    /// </summary>
    public static class HttpRequestExtensions
    {
        /// <summary>
        /// Dump the raw http request to a string. 
        /// </summary>
        /// <param name="request">The <see cref="HttpRequest"/> that should be dumped.       </param>
        /// <returns>The raw HTTP request.</returns>
        public static string ToRaw(this HttpRequest request)
        {
            StringWriter writer = new StringWriter();

            WriteStartLine(request, writer);
            WriteHeaders(request, writer);
            WriteBody(request, writer);

            return writer.ToString();
        }

        private static void WriteStartLine(HttpRequest request, StringWriter writer)
        {
            const string SPACE = " ";

            writer.Write(request.HttpMethod);
            writer.Write(SPACE + request.Url);
            writer.WriteLine(SPACE + request.ServerVariables["SERVER_PROTOCOL"]);
        }

        private static void WriteHeaders(HttpRequest request, StringWriter writer)
        {
            foreach (string key in request.Headers.AllKeys)
            {
                writer.WriteLine(string.Format("{0}: {1}", key, request.Headers[key]));
            }

            writer.WriteLine();
        }

        private static void WriteBody(HttpRequest request, StringWriter writer)
        {
            StreamReader reader = new StreamReader(request.InputStream);

            try
            {
                string body = reader.ReadToEnd();
                writer.WriteLine(body);
            }
            finally
            {
                reader.BaseStream.Position = 0;
            }
        }
    }
}

5
बहुत अच्छा कोड! लेकिन इसके लिए MVC 4 मैं के साथ काम करने के लिए करने के लिए वर्ग के नाम बदलना पड़ा HttpRequestBaseExtensionsऔर बदलने के लिए HttpRequestकरने के लिए HttpRequestBaseहर जगह पर।
दिमित्री

35

आप अनुरोध के साथ भेजे गए मूल HTTP हेडर प्राप्त करने के लिए ALL_RAW सर्वर चर का उपयोग कर सकते हैं, फिर आप इनपुटस्ट्रीम को इस प्रकार प्राप्त कर सकते हैं:

string originalHeader = HttpHandler.Request.ServerVariables["ALL_RAW"];

बाहर की जाँच करें: http://msdn.microsoft.com/en-us/library/ms524602%28VS.90%29/aspx


इसने मेरे लिए भी काम किया। यहां तक ​​कि एक हैंडलर में होने की जरूरत नहीं थी। मैं अभी भी इसे पृष्ठ से एक्सेस करने में सक्षम था।
हेलेथी

3
या ASP.NET सर्वर संदर्भ में, का उपयोग करें: यह। Request.ServerVariables ["ALL_RAW"];
पीटर स्टेनगनर

मैं Request.InputStream से अनुरोध निकाय प्राप्त करने में सक्षम नहीं हूं, यह हर बार मेरे लिए "" वापस लौटता है, हालांकि ALL_RAW अनुरोध शीर्ष लेख वापस करने के लिए बहुत अच्छा काम करता है, इसलिए यह उत्तर आधा सही है।
जस्टिन

1
आप HttpContext.Current.Requestएमवीसी नियंत्रकों, एएसपीएक्स पृष्ठों, आदि के बाहर वर्तमान संदर्भ को हथियाने के लिए भी उपयोग कर सकते हैं ... बस यह सुनिश्चित करें कि यह पहले शून्य नहीं है;)
jocull

16

ठीक है, मैं एक परियोजना पर काम कर रहा हूं और किया है, शायद बहुत गहरा नहीं है, एक अनुरोध पैरा का उपयोग कर लॉग:

जरा देखो तो:

public class LogAttribute : ActionFilterAttribute
{
    private void Log(string stageName, RouteData routeData, HttpContextBase httpContext)
    {
        //Use the request and route data objects to grab your data
        string userIP = httpContext.Request.UserHostAddress;
        string userName = httpContext.User.Identity.Name;
        string reqType = httpContext.Request.RequestType;
        string reqData = GetRequestData(httpContext);
        string controller = routeData["controller"];
        string action = routeData["action"];

        //TODO:Save data somewhere
    }

    //Aux method to grab request data
    private string GetRequestData(HttpContextBase context)
    {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < context.Request.QueryString.Count; i++)
        {
            sb.AppendFormat("Key={0}, Value={1}<br/>", context.Request.QueryString.Keys[i], context.Request.QueryString[i]);
        }

        for (int i = 0; i < context.Request.Form.Count; i++)
        {
            sb.AppendFormat("Key={0}, Value={1}<br/>", context.Request.Form.Keys[i], context.Request.Form[i]);
        }

        return sb.ToString();
    }

आप इसे पूरी तरह से लॉग इन करने के लिए अपने नियंत्रक वर्ग को सजा सकते हैं:

[Log]
public class TermoController : Controller {...}

या बस कुछ व्यक्तिगत कार्रवाई विधियों को लॉग इन करें

[Log]
public ActionResult LoggedAction(){...}

12

किसी भी कारण से आपको इसे प्रबंधित कोड में रखने की आवश्यकता है?

यह उल्लेखनीय है कि आप IIS 7 में विफल ट्रेस लॉगिंग को सक्षम कर सकते हैं यदि आपको पहिया का फिर से आविष्कार करना पसंद नहीं है। यह हेडर, अनुरोध और प्रतिक्रिया निकाय के साथ-साथ कई अन्य चीजों को लॉग करता है।

विफल ट्रेस लॉगिंग


क्या होगा अगर यह एक विफलता नहीं है?
सिनास्टेटिक

7
आप HTTP 200 के साथ
Fail

2
यह अब तक का सबसे सरल उपाय है।
Kehlan Krumme

पूरे स्टैक ट्रेस देखने के लिए, इसे जोड़ने के लिए जरूरी हो गया था GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;के अंत में Register(..)में WebApiConfig.csहै, लेकिन इस संस्करण के बीच भिन्न हो सकते हैं।
इवगेनी सर्गेव

8

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

public class CaptureTrafficModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler(context_BeginRequest);
        context.EndRequest += new EventHandler(context_EndRequest);
    }

    void context_BeginRequest(object sender, EventArgs e)
    {
        HttpApplication app = sender as HttpApplication;

        OutputFilterStream filter = new OutputFilterStream(app.Response.Filter);
        app.Response.Filter = filter;

        StringBuilder request = new StringBuilder();
        request.Append(app.Request.HttpMethod + " " + app.Request.Url);
        request.Append("\n");
        foreach (string key in app.Request.Headers.Keys)
        {
            request.Append(key);
            request.Append(": ");
            request.Append(app.Request.Headers[key]);
            request.Append("\n");
        }
        request.Append("\n");

        byte[] bytes = app.Request.BinaryRead(app.Request.ContentLength);
        if (bytes.Count() > 0)
        {
            request.Append(Encoding.ASCII.GetString(bytes));
        }
        app.Request.InputStream.Position = 0;

        Logger.Debug(request.ToString());
    }

    void context_EndRequest(object sender, EventArgs e)
    {
        HttpApplication app = sender as HttpApplication;
        Logger.Debug(((OutputFilterStream)app.Response.Filter).ReadStream());
    }

    private ILogger _logger;
    public ILogger Logger
    {
        get
        {
            if (_logger == null)
                _logger = new Log4NetLogger();
            return _logger;
        }
    }

    public void Dispose()
    {
        //Does nothing
    }
}

3
आप सुरक्षित रूप से किसी भी स्ट्रीम के अलावा app.Response.Filter कास्ट नहीं कर सकते। अन्य HttpModules अपनी प्रतिक्रिया फ़िल्टर को अपने स्वयं के साथ लपेट सकते हैं और इस मामले में आपको एक अमान्य कास्ट अपवाद मिलेगा।
मीका झोल्टू

अनुरोध स्ट्रीम पढ़ते समय क्या यह नहीं होना चाहिए Encoding.UTF8, या हो सकता Encoding.Defaultहै? या बस एक का उपयोग करें StreamReader(
डिस्पोजेबल कैविट्स के

5

ठीक है, इसलिए ऐसा लगता है कि जवाब "नहीं, आपको कच्चा डेटा नहीं मिल सकता है, आपको पार्स की गई वस्तुओं के गुणों से अनुरोध / प्रतिक्रिया का पुनर्निर्माण करना होगा"। ओह ठीक है, मैंने पुनर्निर्माण का काम किया है।


3
क्या आपने Vineus के ServerVariables ["ALL_RAW"] के बारे में टिप्पणी देखी? मैंने इसे स्वयं अभी तक आज़माया नहीं है, लेकिन इसे ग्राहक द्वारा भेजे गए अनुसार कच्चे हेडर की जानकारी को ठीक से लौटाने के लिए प्रलेखित किया गया है। यहां तक ​​कि अगर दस्तावेज़ गलत निकला, और यह एक पुनर्निर्माण कर रहा है, हे, मुफ्त पुनर्निर्माण :-)
जोनाथन गिल्बर्ट

3

IHttpModule का उपयोग करें :

    namespace Intercepts
{
    class Interceptor : IHttpModule
    {
        private readonly InterceptorEngine engine = new InterceptorEngine();

        #region IHttpModule Members

        void IHttpModule.Dispose()
        {
        }

        void IHttpModule.Init(HttpApplication application)
        {
            application.EndRequest += new EventHandler(engine.Application_EndRequest);
        }
        #endregion
    }
}

    class InterceptorEngine
    {       
        internal void Application_EndRequest(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;

            HttpResponse response = application.Context.Response;
            ProcessResponse(response.OutputStream);
        }

        private void ProcessResponse(Stream stream)
        {
            Log("Hello");
            StreamReader sr = new StreamReader(stream);
            string content = sr.ReadToEnd();
            Log(content);
        }

        private void Log(string line)
        {
            Debugger.Log(0, null, String.Format("{0}\n", line));
        }
    }

3
एलेक्स और मेरे स्वयं के अनुभव के अनुसार, मुझे नहीं लगता कि आप HttpResponse.OutputStream से पढ़ सकते हैं, इसलिए प्रक्रिया विधि में लॉगिंग करने का आपका तरीका शायद काम नहीं करेगा।
विलियम ग्रोस

2
विलियम सही है। HttpResponse.OutputStream पठनीय नहीं है। मुझे एक हल मिल गया है जो HttpResponse.Filter का उपयोग करना है और डिफ़ॉल्ट आउटपुट स्ट्रीम को अपने स्वयं के साथ बदलना है।
एरिक फैन


3

अगर कभी-कभार उपयोग के लिए, एक तंग कोने के आसपास पाने के लिए, नीचे के बारे में कुछ कच्चा कैसे हो?

Public Function GetRawRequest() As String
    Dim str As String = ""
    Dim path As String = "C:\Temp\REQUEST_STREAM\A.txt"
    System.Web.HttpContext.Current.Request.SaveAs(path, True)
    str = System.IO.File.ReadAllText(path)
    Return str
End Function

1

आप .NET 4.5 में अन्य उत्तरों में उल्लिखित DelegatingHandlerका उपयोग किए बिना इसे पूरा कर सकते हैंOutputFilterStream.CopyToAsync() फ़ंक्शन ।

मुझे विवरणों पर यकीन नहीं है, लेकिन यह उन सभी बुरी चीजों को ट्रिगर नहीं करता है जो तब होती हैं जब आप सीधे प्रतिक्रिया स्ट्रीम पढ़ने का प्रयास करते हैं।

उदाहरण:

public class LoggingHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        DoLoggingWithRequest(request);
        var response = await base.SendAsync(request, cancellationToken);
        await DoLoggingWithResponse(response);
        return response;
    }

    private async Task DologgingWithResponse(HttpResponseMessage response) {
        var stream = new MemoryStream();
        await response.Content.CopyToAsync(stream).ConfigureAwait(false);     
        DoLoggingWithResponseContent(Encoding.UTF8.GetString(stream.ToArray()));

        // The rest of this call, the implementation of the above method, 
        // and DoLoggingWithRequest is left as an exercise for the reader.
    }
}

0

मुझे पता है कि यह प्रबंधित कोड नहीं है, लेकिन मैं ISAPI फ़िल्टर का सुझाव देने जा रहा हूं। यह कुछ साल हो गए हैं क्योंकि मुझे अपना ISAPI बनाए रखने का "आनंद" मिला है, लेकिन मुझे याद है कि एएसपी.नेट के पहले और बाद में आपको यह सब सामान मिल सकता है।

http://msdn.microsoft.com/en-us/library/ms524610.aspx

यदि HTTPModule आपकी ज़रूरत के लिए पर्याप्त नहीं है, तो मुझे नहीं लगता कि विस्तार की आवश्यक मात्रा में ऐसा करने का कोई प्रबंधित तरीका है। हालांकि यह एक दर्द होने वाला है।


0

मैं दूसरों से सहमत हूं, IHttpModule का उपयोग करें। इस प्रश्न के उत्तर पर एक नज़र डालें, जो लगभग वही काम करता है जो आप पूछ रहे हैं। यह अनुरोध और प्रतिक्रिया को लॉग करता है, लेकिन हेडर के बिना।

ScriptService WebService अनुरोधों का पता लगाने के लिए कैसे?


0

आपके आवेदन के बाहर ऐसा करना सबसे अच्छा हो सकता है। आप इस तरह (और भी बहुत कुछ) करने के लिए रिवर्स प्रॉक्सी सेट कर सकते हैं। रिवर्स प्रॉक्सी मूल रूप से एक वेब सर्वर है जो आपके सर्वर रूम में बैठता है, और आपके वेब सर्वर (क्लाइंट) और क्लाइंट के बीच में खड़ा होता है। Http://en.wikipedia.org/wiki/Reverse_proxy देखें


0

FigmentEngine से सहमत, IHttpModuleजाने का रास्ता प्रतीत होता है।

में देखो httpworkerrequest, readentitybodyऔर GetPreloadedEntityBody

आपको ऐसा करने की httpworkerrequestआवश्यकता है:

(HttpWorkerRequest)inApp.Context.GetType().GetProperty("WorkerRequest", bindingFlags).GetValue(inApp.Context, null);

inApphttpapplication ऑब्जेक्ट कहां है।


1
मैंने पहले ही कहा है कि उत्तर उपयुक्त नहीं है क्योंकि यह मेरे द्वारा पूछी गई अधिकांश जानकारी पर कब्जा नहीं करता है। यह उत्तर किसी भी तरह से कैसे सहायक है?
ग्रेग बीच

अधिक व्याख्या, यह कैसे किसी भी तरह से उत्तर सहायक है?
8 अगस्त को

0

HttpRequestऔर HttpResponseपूर्व MVC के पास एक उद्देश्य होता था GetInputStream()और GetOutputStream()इसका उपयोग उस उद्देश्य के लिए किया जा सकता था। MVC में उन भाग में नहीं देखा है तो मुझे यकीन है कि वे उपलब्ध नहीं हैं, लेकिन एक विचार हो सकता है :)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.