سؤال


أريد استبدال مرشح ISAPI القديم الذي ركض على IIS6. يتحقق هذا المرشح إذا كان الطلب من نوع خاص ، ثم يعالج الرأس ويستمر في الطلب. تتم إضافة رؤوس في طريقة التلاعب التي أحتاجها لاتصال وحدة ISAPI خاصة أخرى.
لذلك لدي رمز ISAPI C ++ مثل:

DWORD OnPreProc(HTTP_FILTER_CONTEXT *pfc, HTTP_FILTER_PREPROC_HEADERS *pHeaders)
{
    if (ManipulateHeaderInSomeWay(pfc, pHeaders))
    {
        return SF_STATUS_REQ_NEXT_NOTIFICATION;
    }
    return SF_STATUS_REQ_FINISHED;
}

أريد الآن إعادة كتابة مرشح ISAPI كوحدة مُدارة لـ IIS7. لذلك لدي شيء مثل هذا:

private void OnMapRequestHandler(HttpContext context)
{
    ManipulateHeaderInSomeWay(context);
}

وماذا الان؟ يبدو أن الطلب لا يفعل ما ينبغي؟
لقد كتبت بالفعل وحدة أصلية IIS7 التي تنفذ نفس الطريقة. لكن هذه الطريقة لها قيمة إرجاع يمكنني من خلالها معرفة ما يجب القيام به بعد ذلك:

REQUEST_NOTIFICATION_STATUS CMyModule::OnMapRequestHandler(IN IHttpContext *pHttpContext, OUT IMapHandlerProvider *pProvider)
{
    if (DoSomething(pHttpContext))
    {
        return RQ_NOTIFICATION_CONTINUE;
    }
    return RQ_NOTIFICATION_FINISH_REQUEST;
}

فهل هناك طريقة لإرسال سياق بلدي المعالج مرة أخرى؟

هل كانت مفيدة؟

المحلول

لقد وجدته أخيرًا. كما ذكرت في التعليقات ، أضيف رؤوسًا إلى الطلب الذي يحتاجه DLL الخاص بي والذي يعالج الطلب أخيرًا. ال url يحتوي الرأس على المسار إلى DLL. لذلك لا بد لي من القيام بإعادة التوجيه لهذا DLL.
يتم ذلك مع الكود التالي:

private void OnMapRequestHandler(HttpContext context)
{
    ManipulateHeaderInSomeWay(context);
    string url = context.Request.Header["url"]; // path of the DLL

    // now this is the important call!
    context.Server.TransferRequest(url, true);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top