2010-09-14 21 views
11

Câu hỏi của tôi là tương tự nhưng không giống với:HttpModule.Init - an toàn thêm HttpApplication.BeginRequest xử lý trong chế độ tích hợp IIS7

Why can't my host (softsyshosting.com) support BeginRequest and EndRequest event handlers? (Tôi cũng đọc blog mvolo nhắc đến trong đó)

Mục đích là để treo thành công HttpApplication.BeginRequest trong trường hợp IHttpModule.Init (hoặc bất cứ nơi nào bên trong để các mô-đun), sử dụng một HttpModule bình thường tích hợp thông qua cấu hình system.webServer, tức là một trong những không:

  1. xâm Global.asax hoặc
  2. ghi đè lên HttpApplication (mô-đun được dự định là khép kín & có thể sử dụng lại, do đó, ví dụ: Tôi có một cấu hình như thế này):

    <system.webServer> 
    <validation validateIntegratedModeConfiguration="false"/> 
    <modules> 
        <remove name="TheHttpModule" /> 
        <add name="TheHttpModule" type="Company.HttpModules.TheHttpModule" preCondition="managedHandler" /> 
    

Cho đến nay, chiến lược nào tôi đã cố gắng để đính kèm một người biết lắng nghe để HttpApplication.BeginRequest kết quả trong một trong hai điều, triệu chứng 1 là BeginRequest không bao giờ cháy, hoặc triệu chứng 2 là các ngoại lệ sau đây được ném trên tất cả các yêu cầu quản lý, và tôi không thể bắt & xử lý nó từ mã người dùng:

Stack Trace: 
[NullReferenceException: Object reference not set to an instance of an object.] 
System.Web.PipelineModuleStepContainer.GetEventCount(RequestNotification notification, Boolean isPostEvent) +30 
System.Web.PipelineStepManager.ResumeSteps(Exception error) +1112 
System.Web.HttpApplication.BeginProcessRequestNotification(HttpContext context, AsyncCallback cb) +113 
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +616 

Bình luận ra app.BeginRequest += new EventHandler(this.OnBeginRequest) trong Init dừng trừ tất nhiên. Init không tham chiếu đến các đối tượng Context hoặc Request.

Tôi đã thử:

  • Removed tất cả các tài liệu tham khảo để HttpContext.Current bất cứ nơi nào trong dự án (vẫn còn triệu chứng 1)
  • Tested loại bỏ tất cả các mã ra khỏi cơ thể của phương pháp OnBeginRequest của tôi, để đảm bảo vấn đề không phải là nội bộ cho phương pháp (= ngoại lệ)
  • Đánh dấu theo dõi ngăn xếp và chỉ gọi ứng dụng.BeginRequest + = ... khi ngăn xếp không được khởi chạy bởi InitializeApplication (= BeginRequest không kích hoạt)
  • Chỉ gọi ứng dụng.BeginRequest + = trên đường chuyền thứ hai thông qua Init (= BeginRequest không kích hoạt)

Có ai biết cách tiếp cận tốt không? Có một số chiến lược gián tiếp cho hooking Application_Start trong mô-đun (có vẻ như không)? Một sự kiện khác mà a) có thể móc từ phương thức khởi tạo của mô-đun hoặc phương thức Init và b) sau đó là một nơi an toàn để đính kèm trình xử lý sự kiện BeginRequest?

Cảm ơn nhiều

Trả lời

3

phương pháp Init của HttpModule của bạn sẽ được gọi nhiều lần bởi một ứng dụng web đơn (trong khi Application_Start trong global.asax của bạn sẽ chỉ được gọi một lần mỗi AppDomain).

Init thực sự là nơi để nối vào BeginRequest.

Tôi cũng đã gặp phải lỗi này và nó đã được gây ra bởi hooking vào sự kiện BeginRequest nhiều lần. Tôi không chắc chắn nếu nó là một lỗi trong chế độ tích hợp IIS 7 hay không ...

Khi bạn làm app.BeginRequest là bạn gọi bối cảnh.BeginRequest sử dụng tham số ngữ cảnh để phương thức Init của IHttpModule hoặc bạn đang gọi HttpContext .Current.BeginRequest + = ...?

+2

trong 'trống IHttpModule.Init (HttpApplication ứng dụng)', tôi gọi 'app.BeginRequest + = new EventHandler (this.OnApplication_BeginRequest) '. Sau đó, tôi sử dụng một bool tĩnh cấp lớp, _initted, để ngăn chặn việc thêm trình xử lý nhiều lần. Đó là một phần lý do tại sao tình hình là gõ tôi cho một vòng lặp như vậy. –

+0

Cùng một vấn đề ở đây. Tôi cũng đăng lên một chủ đề trên trang IIS, hy vọng một người nào đó từ Microsoft có thể có câu trả lời: http://forums.iis.net/p/1164977/1972908.aspx –

+0

Bất kỳ giải pháp nào? Tôi có thể thêm một httpModule vào bất kỳ ứng dụng ASP.NET nào. Tuy nhiên tôi nhận được lỗi chính xác tương tự khi cố gắng thêm một IHttpModule vào một trang SharePoint 2013 (dựa trên .NET 4.0). Vấn đề xảy ra ngay sau khi tôi đính kèm vào sự kiện BeginRequest. – lapsus

1

Tôi có cùng các sự cố được mô tả ở trên. Tôi thấy rằng một công việc thực tế xung quanh là luôn luôn loại bỏ sau đó thêm xử lý. do đó:

public override void Init() 
    { 
     base.Init(); 

     lock (_initialisationLockObject) 
     { 
      BeginRequest -= Global_BeginRequest; 
      BeginRequest += Global_BeginRequest; 
     } 
    } 

Tôi nghi ngờ rằng trình xử lý sự kiện sẽ bị xóa sau một hoặc nhiều lệnh gọi đến init. Nếu bạn cẩn thận chỉ thử và thêm trình xử lý sự kiện lần đầu tiên, thì các lần sau được gọi là không nhận được một sự kiện được thêm vào và do đó trình xử lý không được gọi. Nếu bạn không thử bất cứ điều gì xảo quyệt để giới hạn số lần sự kiện được thêm vào, thì bạn đã thấy có nhiều tệp đính kèm. Bằng cách đầu tiên cố gắng để loại bỏ sau đó thêm (bên trong một khóa để ngăn chặn bất kỳ điều kiện đua gnarly) dường như làm các trick.

Thật khủng khiếp và chúng tôi không cần phải làm điều này!

Hy vọng rằng sẽ giúp

+0

Trong trường hợp của tôi, tôi chỉ cần làm một cái gì đó như: System.Web.HttpContext.Current.ApplicationInstance.BeginRequest + = ApplicationInstance_BeginRequest; nhưng nó ném một ngoại lệ con trỏ null Các workaoround của + = - = làm việc – orellabac

Các vấn đề liên quan