سؤال

لدي خدمة WCF المستضافة في IIS / ASP.NET التي تقبل مشاركة HTTP (لا تشكل بعد) من الكائنات المتسلسلة.

إذا أرسل العميل طلبات مشوهة (على سبيل المثال، فهو لا يسقط الكائن بشكل صحيح)، فأود تسجيل الرسالة المرسلة لأعلى.

نحن نستخدم أيضا إيماه للقبض على استثناءات غير معالج، لذلك فإن إرفاق بيانات النشر ببساطة سيكون هو خيار أسهل.

يمكنني الحصول على httpcontext الحالي أثناء استثناء، ولكن هذا لا يحتوي فقط على معلومات رأس HTTP.

سؤالي هو: هل هناك طريقة لالتقاط هيئة طلب وظيفة HTTP الأصلية الأصلية؟ أو، فشل ذلك - طريقة أفضل (دون وكيل عكسي) من التقاط المدخلات التي تسبب في الخطأ؟

تحرير: فقط لتوضيح، تشغيل القبض على مستوى الحزمة في جميع الأوقات ليس مناسبا حقا. أنا بعد الحل الذي يمكنني نشره في خوادم الإنتاج، والتي سيكون لها عملاء خارج سيطرتنا أو قدرتنا على مراقبة.

تحرير رقم 2: تم تقديم اقتراح للوصول إلى طلب الطلب. لا يعمل هذا إذا كنت تحاول أن تقرأ بعد قراءة WCF طلب الطلب من الدفق.

عينة قطعة من التعليمات البرمجية لمعرفة كيف حاولت استخدام هذا هنا.

        StringBuilder log = new StringBuilder();

        var request = HttpContext.Current.Request;

        if (request.InputStream != null)
        {
            log.AppendLine(string.Format("request.InputStream.Position = \"{0}\"", request.InputStream.Position));
            if (request.InputStream.Position != 0)
            {
                request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
            }

            using (StreamReader sr = new StreamReader(request.InputStream))
            {
                log.AppendLine(string.Format("Original Input: \"{0}\"", sr.ReadToEnd()));
            }
        }
        else
        {
            log.AppendLine("request.Inputstream = null");
        }


        log.ToString();

ouput من log.tostring () هو:

 preport.inputstream.position = "0" المدخلات الأصلية: ""
هل كانت مفيدة؟

المحلول

بحلول الوقت الذي يحصل فيه على خدمتك، يتم معالجة الطلب وغير متاح لك.

ومع ذلك ... يمكنك إرفاق رسالة مفتش. وبعد يسمح لك مفتشي الرسائل بتهبط الرسالة قبل وصولها إلى تطبيقات التشغيل الخاصة بك. يمكنك إنشاء نسخة مخزنة من الرسالة، ونسخها في تشغيل العملية.

الاختراق القبيح بالطبع، وسيعني علبة الذاكرة كما هو الحال الآن نسختين من الرسالة تطفو حول كل طلب.

نصائح أخرى

هل نظرت إلى System.Web.Request.inputstream؟ يجب أن يكون بالضبط ما تريد.

كيفية "الترجيع" الخاصية Inputstream.

    if (Request.InputStream.Position != 0)
    {
        Request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
    }

خيار آخر يجب أن تنظر إليه هو التقاط هذه المعلومات مع httpmodule على الحدث البغيض. يجب أن تكون البيانات موجودة في حدث بدائل لأنني لا أعتقد أن WCF يلتقط الطلب حتى بعد postauthenticatesevent.

من ضمن ASP.NET (خدمة الويب ASP ضمن IIS) يساعد التعليمات البرمجية التالية:

if (request.InputStream.Position != 0)
{
  request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
}

WCF ربما مختلفة (هذا هو الذي يتخلص من inputstream بعد قراءة ذلك)

استخدام fiddler. خالية من MS. يعمل عظيم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top