Application_Start không bắn?


143

Tôi có một ứng dụng ASP.NET MVC (beta) mà tôi đang làm việc và đang gặp khó khăn khi tìm hiểu xem tôi có làm gì sai không, hoặc nếu Application_Start phương thức trong Global.asax.cs thực tế không kích hoạt khi tôi thử để gỡ lỗi ứng dụng.

Tôi đặt một điểm dừng trên một dòng trong Application_Startphương thức của mình và tôi hy vọng rằng khi tôi cố gắng gỡ lỗi ứng dụng thì điểm dừng sẽ bị tấn công ... nhưng nó không bao giờ xảy ra. Không phải sau khi tôi thiết lập lại IIS, không phải sau khi tôi khởi động lại, không bao giờ. Tui bỏ lỡ điều gì vậy? Tại sao phương pháp này không bao giờ được gọi?


Trang global.asax của bạn có kế thừa từ lớp toàn cầu mà phương thức của bạn đang ở không?

Tôi đã bị trả về trường hợp global.asaxtập tin bị mất. vì vậy điều đó cũng đáng để kiểm tra :-)
itho

Câu trả lời:


85

Nếu đây là trong IIS, ứng dụng có thể bắt đầu trước khi trình gỡ lỗi được đính kèm. Nếu vậy, tôi không chắc chắn nếu bạn có thể ngủ đủ lâu để được gắn bó.

Trong Visual Studio, bạn có thể đính kèm trình gỡ lỗi vào một quy trình. Bạn làm điều này bằng cách nhấp vào Gỡ lỗi >> Đính kèm để xử lý. Đính kèm với trình duyệt và sau đó nhấn ứng dụng của bạn. Để an toàn, sau đó khởi động lại IIS và truy cập trang web. Tôi không tin chắc 100% rằng điều này sẽ giải quyết vấn đề, nhưng nó sẽ làm tốt hơn nhiều so với việc bắn ra một luồng ngủ trong App_Start.

Một tùy chọn khác được lưu trữ tạm thời trong máy chủ web tích hợp cho đến khi bạn hoàn thành việc gỡ lỗi ứng dụng bắt đầu.


21
để mở rộng - (trong VS2010, sử dụng loại dự án MVC 3) nhấp chuột phải vào dự án web> thuộc tính> web (tab) và đảm bảo "Sử dụng Visual Studio Development Server" được chọn nút radio. Sau đó, các điểm dừng Application_Start của bạn sẽ được nhấn tốt.
MemeDeveloper

Cảm ơn @MemoDeveloper !! Thật là tuyệt vời !!
Praveen Prajapati

2
Ahhhhhh mannnnnnn, tôi đã mất một vài giờ. Lần nữa!! Cảm ơn câu trả lời này. :)
Samuel

Nếu bạn đặt điểm dừng trong Visual Studio trong Global.asax.cs trong Application_Start () và nó không kích hoạt, hãy kiểm tra loại bản dựng của bạn. Nếu bạn đang chạy như một bản phát hành, điểm dừng này có thể không kích hoạt. Chuyển sang Debug và nó sẽ dừng lại.
Paul

171

Lưu ý: một cách dễ dàng khác để sử dụng "Máy chủ phát triển Visual Studio" hoặc IIS Express (ví dụ vì bạn đang phát triển dựa trên IIS và có các cài đặt cụ thể bạn cần để hoạt động đúng của ứng dụng) là chỉ cần chạy trong IIS (I sử dụng Máy chủ web tùy chỉnh + lưu trữ tệp nhập + liên kết IIS vào cùng một tên miền)

  1. chờ phiên gỡ lỗi để khởi động ok
  2. sau đó chỉ cần thực hiện chỉnh sửa khoảng trắng vào web.config gốc và lưu tệp
  3. làm mới trang của bạn (Ctrl + F5)

Điểm dừng của bạn sẽ được nhấn độc đáo và bạn có thể tiếp tục gỡ lỗi trong môi trường sống IIS tự nhiên của mình . Tuyệt quá !


Đây là hookup tái chế AppDomain tuyệt vời. Cảm ơn !!
Sanjay10

Không có thêm Visual Studio Development Server. stackoverflow.com/questions/19676527/ cấp
mac10688

1
@ mac10688 đúng, nhưng vẫn có "IIS Express" thường không phải là môi trường sản xuất. Cập nhật câu trả lời cho phù hợp.
MemeDeveloper

Câu trả lời chắc chắn được chấp nhận. Tôi trỏ thiết bị tới IIS của mình sẽ không cho phép giao tiếp khi sử dụng phiên bản IIS Express! Điều này làm việc một sự quyến rũ.
Matt Skeldon

54

Những điều sau đây sẽ giúp ích trong mọi trường hợp (bất kể bạn đang sử dụng IIS, Cassini hay bất cứ điều gì):

  1. Đặt điểm dừng của bạn trong Application_Start
  2. Bắt đầu gỡ lỗi (điểm dừng có lẽ không được nhấn) -> một trang được hiển thị trong trình duyệt
  3. Thay đổi web.config (ví dụ: nhập một dòng trống) và lưu nó
  4. Tải lại trang trong trình duyệt -> điểm dừng được nhấn!

Tại sao điều này làm việc? Khi web.config bị thay đổi, máy chủ web (IIS, Cassini, v.v.) sẽ tái chế, nhưng trong trường hợp này (vì bất kỳ lý do gì), quy trình vẫn giữ nguyên, vì vậy bạn tiếp tục gắn nó với trình gỡ lỗi (Visual Studio ).


3
Clone, hai năm sau của stackoverflow.com/a/7655582/11635 - xem xét xóa và đưa bất kỳ thông tin bổ sung nào vào một nhận xét
Ruben Bartelink

Thật ra @RubenBartelink, tôi nghĩ câu trả lời này rõ ràng hơn câu hỏi kia, vì cách diễn đạt và giải thích thêm.
Heriberto Lugo

1
@HeribertoLugo Tôi rất tuyệt với điều đó - 50 upvote khó có thể không đồng ý hoàn toàn (Tuy nhiên, tôi rất vui khi được chỉnh sửa câu trả lời khác để thu hẹp khoảng cách nếu có ai đó có thời gian và bối cảnh; đã sử dụng trình gỡ lỗi trên IIS!)
Ruben Bartelink

Tôi đồng ý chỉnh sửa cái khác và loại bỏ cái này sẽ là con đường tốt hơn .. tôi đã thấy cái khác trước và sau đó hơi tắt, vì vậy nó không hoạt động .. khi tôi thấy cái này sau khi dành thêm nửa giờ cho nó, sau đó nó đã làm ý nghĩa hơn .. đó là nửa giờ tôi không cần phải mất ..
Heriberto Lugo

22

Tôi cũng gặp vấn đề với các điểm dừng trong application_start với IIS một ứng dụng được lưu trữ. Một cách giải quyết tốt là sử dụng Debugger.Break (); trong mã thay vì điểm dừng VS


2
Tôi tin rằng việc không đạt điểm dừng như một việc cần làm khi chạy nhóm ứng dụng của bạn ở chế độ đường ống tích hợp. Bạn đang sử dụng đó?
Flores

9

Tôi có cùng một vấn đề. Tôi đã thực hiện rất nhiều đổi tên trong giải pháp của tôi. Sau đó, tôi có hai ứng dụng web không hoạt động và một số ứng dụng web khác đều ổn. Tôi đã có lỗi rằng tôi có tuyến đường sai. Khi tôi đã cố gắng thiết lập điểm dừng trong Application_Startphương thức và sau đó khởi động lại IIS, VS đã không thực hiện ngắt. Với các ứng dụng web khả thi đã phá vỡ hoạt động. Sau đó, tôi đã nhớ lại rằng "giải pháp sạch" và "xây dựng lại" không xóa các hội đồng còn lại sau khi đổi tên. Và đó là giải pháp! Tôi đã tự xóa các binthư mục của các ứng dụng web lỗi của mình và sau đó thấy lỗi mới trong Global.asax Inherits=""thuộc tính đã được tham chiếu dll cũ. Tôi đã thay đổi nó trên mới và bắt đầu làm việc. Giả sử rằng, trong khi đổi tên Global.asax không được cập nhật,


Wow, đó là một nỗi đau để tìm! Đó là cho tiền boa!
Landon Poch

@Dao Thực sự điều này thật tuyệt vời, Cảm ơn;) Tôi đã lãng phí vài giờ cho việc này, tôi nên tìm câu trả lời của bạn trước đó :)
Pankaj Parkar

7

Có cùng một vấn đề trong một Dự án mà chúng tôi đã tiếp quản sau khi một nhà cung cấp khác xây dựng nó. Vấn đề là trong khi có một số lệnh được viết bởi nhà cung cấp trước đó trong Global.asax.cs, điều này có thể khiến bạn tin rằng nó đang được sử dụng, thì nó thực sự đã bị bỏ qua hoàn toàn. Global.asax không được thừa hưởng từ nó và thật dễ dàng để không bao giờ thấy tệp này nếu có tệp .cs - bạn phải nhấp chuột phải vào Global.asax và nhấp vào Xem Đánh dấu để thực sự thấy nó.

Toàn cầu.asax:

<%@ Application Language="C#" %>

Cần phải đổi thành:

<%@ Application Codebehind="Global.asax.cs" Inherits="ProjectNamespace.MvcApplication" Language="C#" %>

Trong đó ProjectNamespace là bất cứ không gian tên nào thuộc lớp Global.asax.cs của bạn (thường là tên của Dự án của bạn).

Trong trường hợp của chúng tôi, tệp chứa một loạt mã nội tuyến, một số mã được sao chép từ tệp .cs, một số thì không. Chúng tôi chỉ chuyển mã nội tuyến sang tệp .cs và dần dần hợp nhất các thay đổi của chúng tôi lại.


Điều đó là vậy đó. Tôi đã thêm một ngoại lệ vào Bắt đầu ứng dụng (theo câu trả lời của Tù nhân ZERO) và nó hoàn toàn không kích hoạt, vì vậy không liên quan gì đến trình gỡ lỗi. Cập nhật đánh dấu Global.asax đã sửa nó.
Patrick Borkowicz

5

Hãy thử chuyển chế độ đường ống được quản lý cho nhóm ứng dụng sang "Cổ điển" thay vì "Tích hợp". Điều đó đã giải quyết vấn đề cho tôi. Nhìn vào lý do bây giờ ...

(Đạo cụ cho câu trả lời này thuộc về Flores (xem nhận xét của anh ấy về câu trả lời của chính anh ấy), tôi chỉ muốn cung cấp đây là một câu trả lời riêng biệt để thu hút sự chú ý hơn về nó)


Có nó hoạt động. Nhưng nếu bạn cho rằng ứng dụng của bạn sẽ hoạt động trong nhóm ứng dụng tích hợp, thì nó cũng nên được gỡ lỗi trong nhóm tích hợp.
Karel Kral

Ứng dụng của tôi cũng sẽ không đạt điểm dừng sau "F5" khi tôi chuyển từ Cổ điển sang Tích hợp. Bạn đã bao giờ khám phá tại sao? Tôi không có bất kỳ yêu cầu nào để sử dụng Tích hợp, nhưng thật đáng thất vọng khi những thứ này không hoạt động mà không có lý do rõ ràng.
CodexArcanum

5

Hãy chắc chắn rằng global.asax của bạn không thuộc thư mục con. Nó phải được đặt ở cấp gốc vào dự án của bạn.


Cảm ơn bạn rất nhiều!!! Bạn đã cứu tôi khỏi phát điên! Đây chính xác là những gì đã gây ra vấn đề của tôi.
Yann Duran

1
Vấn đề của tôi là tôi vừa tạo ra một lớp được gọi Global.asax.csvà mong đợi nó hoạt động. Bạn cần tạo nó bằng cách sử dụng Add-> New Item-> Global Application Classđể nó được tạo bằng Global.asaxtệp cấu hình biểu mẫu web tương ứng .
Levi Fuller

4

Chúng tôi đã có một vấn đề tương tự, trong đó global.asax.cs đã bị bỏ qua.

Hóa ra trang web đã được nâng cấp từ trang web .NET 2 được biên dịch sẵn thành trang web .NET 4.0. Trên máy chủ, PrecompiledApp.configtập tin chưa bị xóa khỏi thư mục gốc. Sau khi xóa nó và tái chế nhóm ứng dụng IIS và chạm vào web.config để khởi động lại ứng dụng, mã trong Global.asax.cs bắt đầu hoạt động tốt.


3

Tôi đã gặp sự cố một lần khi Global.asax và Global.asax.cs không thực sự được sao chép vào thư mục IIS bởi các tập lệnh triển khai ... Vì vậy, nó hoạt động khi gỡ lỗi trên máy chủ phát triển, nhưng không phải trong IIS.


Tôi đã từng gặp vấn đề tương tự. Sau khi tôi tải Global.asax lên máy chủ, vấn đề đã được giải quyết.
Moslem Hady

3

Một mục cuối ...

Để kiểm tra xem Ứng dụng IIS có được khởi động hay không trước khi trình gỡ lỗi có đủ thời gian để đính kèm, chỉ cần thêm ứng dụng này vào đầu hoặc cuối GLOBAL.ASAX của bạn Application_Start.

throw new ApplicationException("Yup, it fired");

2

Khi bạn nói "gỡ lỗi", bạn có nghĩa là thực sự khởi chạy ứng dụng từ máy chủ web tích hợp của Visual Studio để gỡ lỗi hay bạn có nghĩa là gắn vào quy trình trong IIS? Nếu là cái trước, bạn nên nhấn Application_Start, nhưng nếu nó là cái sau, thì có thể khó có thể xử lý sớm để bắt kịp nó.


Chính xác, tôi có nghĩa là khởi chạy ứng dụng từ VS. Tôi có nó được lưu trữ trong IIS, vì vậy VS đang gắn vào quá trình đó. Bạn đang nói rằng sự kiện này kích hoạt trước khi VS có thể đính kèm vào quy trình?
Bob Yexley

2

Đóng Visual Studio và xóa binobjcác thư mục trong dự án web của bạn (hoặc tất cả các dự án trong giải pháp).

Dưới đây là các lệnh để xóa các thư mục này khỏi tất cả các dự án của bạn:

rm *\bin -r
rm *\obj -r

2

Tôi đã thực hiện một số thay đổi dựa trên "Phân tích mã khi xây dựng" từ Visual Studio. Phân tích mã đề xuất "CA1822 Đánh dấu các thành viên là tĩnh" cho Application_Start () trong Global.asax. Tôi đã làm điều đó và kết thúc với vấn đề này.

Tôi đề nghị loại bỏ thông báo Phân tích mã này và không thay đổi chữ ký của các phương thức / lớp được tạo tự động bởi nền tảng được sử dụng để khởi động Ứng dụng. Chữ ký của phương thức Application_Start có thể không tĩnh vì một lý do.

Tôi đã hoàn nguyên về chữ ký phương thức này và Application_Start () đã bắn lại:

    protected void Application_Start()
    { ... }

2

Tôi gặp phải vấn đề này khi sử dụng trang tĩnh (ví dụ: index.html) làm trang khởi động - Bắt đầu ứng dụng không được gọi. Tôi phát hiện ra rằng việc phục vụ một trang tĩnh không thực sự khởi động ứng dụng. Yêu cầu một trang .aspx nào.


Đây là những gì đã làm cho tôi. Cám ơn.
phát lại

2

Đảm bảo các không gian tên trong Global.asax và Global.asax.cs giống nhau. Nếu chúng khác nhau, nó sẽ không gây ra bất kỳ lỗi nào nhưng cũng sẽ không đạt điểm dừng vì nó hoàn toàn không thực hiện application_start.


1

Tôi nghĩ rằng sự kiện bắt đầu ứng dụng chỉ được kích hoạt khi yêu cầu đầu tiên được thực hiện, bạn có đang nhấn trang web của mình không (tức là đưa ra yêu cầu)?


Có, tôi đang yêu cầu ứng dụng.
Bob Yexley

1

Tôi đã gặp vấn đề này trong một dự án .net 4 mẫu web vs2010 và đã thử mọi thứ được đề cập trên trang này. Đã kết thúc loại bỏ và thêm global.asax thực sự giải quyết vấn đề cho tôi.


1

Tôi có cùng một vấn đề, không thể bắt Application_Start. Và lý do là nó đã không bắn vào một lỗi sai trong tệp đánh dấu. Tệp đánh dấu Global.asax đang kế thừa một lớp khác ...


1

Bạn đã kiểm tra cài đặt Project chưa? Tôi gặp vấn đề này và tôi đã có URL Bắt đầu đi đến một cổng khác với cổng cụ thể của máy chủ của tôi. Tôi mất quá nhiều thời gian để tìm ra ...


1

Sau khi thử nhiều câu trả lời khác có thể áp dụng trong tình huống của tôi và không gặp may mắn với bất kỳ câu trả lời nào, tôi đã đi vào các thuộc tính cho dự án Web (dự án phía máy chủ cho ứng dụng Silverlight sử dụng Dịch vụ RIA), nhấp vào Tab "Web" và thay đổi Máy chủ được chọn từ "IIS cục bộ" thành "IIS Express". (Lưu ý tôi đang sử dụng VS2013.) Điều này đã giải quyết vấn đề. Application_Start thực thi trong "IIS Express" nhưng không phải trong "IIS cục bộ". Hấp dẫn...


Nó đang được thực thi. Bạn chỉ đơn giản là không thể gỡ lỗi nó vì bạn chưa gắn bó với quy trình IIS hoặc gắn liền với nó sau khi nó được thực thi.
uygar.raf

1

Tôi đã cố gắng chuyển qua mã trong RegisterRoutes () được gọi từ Ứng dụng bắt đầu và không nhấn vào điểm dừng của tôi. Tôi xác định Application_Start không được gọi. Tôi đã phải thực hiện một thay đổi để thực hiện một thay đổi bề ngoài cho App_start / RouteConfig.cs và lưu nó trước khi Application_Start được gọi. Tôi đoán những tập tin này được lưu trữ ở đâu đó và không được gọi trừ khi có thay đổi.


1

Vấn đề tương tự của tôi đã được giải quyết bằng cách thêm tham chiếu System.Web.Routinglắp ráp trong dự án

nhập mô tả hình ảnh ở đây


0

Nếu bạn đang sử dụng System.Diagnostics.Debugger.Break (); cách giải quyết (mà tôi nghĩ là tốt khi sử dụng tạm thời) và nó "không hoạt động" trên Máy Windows 8 của bạn. Lý do là một lỗi trong "Chỉ trong thời gian gỡ lỗi" của Visual Studio.

Cách khắc phục như sau là sửa lỗi cho "Trình gỡ lỗi thời gian của Visual Studio"

Mở regedit và truy cập HKEY_CLASSES_ROOT \ AppID {E62A7A31-6025-408E-87F6-81AEB0DC9347} cho giá trị đăng ký 'AppIDFlags', đặt cờ thành 0x8

Thêm thông tin tại đây: http://connect.microsoft.com/VisualStudio/feedback/details/770786/just-in-time-debugging-operation-atteemed-is-not-supported


0

Trong trường hợp của tôi, việc giết phiên bản ASP.NET Development Server tích hợp thông qua khay hệ thống đã giải quyết được vấn đề.


0

Những thứ kỳ lạ và điên rồ ... nhưng gỡ lỗi trên máy chủ và một người dùng khác đã để IIS Express chạy trên phiên của họ. Tôi đã phải đăng xuất người dùng đó để giết các tiến trình IIS Express đang chạy của mình. Điều đó dường như đã khắc phục vấn đề!

Cập nhật

Sau khi dành hơn 1 giờ để theo đuổi những gì gây ra vấn đề ... đây là thỏa thuận: Tôi phần nào xoay sở để nhập một phần sbên <appSettings>trong Web.config. Visual Studio đã cố gắng cảnh báo tôi trong Error Listcửa sổ với một cảnh báo . Tôi thú nhận rằng tôi hiếm khi kiểm tra các cảnh báo ... nên bắt đầu kiểm tra nó từ bây giờ. : D Ngay sau khi tôi gỡ bỏ vi phạm s, điểm dừng bị tấn công Application_Start.

nhập mô tả hình ảnh ở đây


0

Tôi gặp vấn đề này khi cố gắng khởi tạo log4net. Tôi quyết định chỉ tạo một hàm tạo tĩnh cho Global.asax

static Global(){
//Do your initialization here statically
}

0

Vấn đề chủ yếu xảy ra khi bạn cố gắng di chuyển tệp Global.asax sang thư mục giải pháp khác. Định vị lại tệp Global.asax vào vị trí mặc định. Nó sẽ hoạt động như mong đợi.


Điều gì xảy ra nếu mọi thứ trong trang web được biên dịch trước, bao gồm Global.asax.aspx? Tôi có các tập tin được biên dịch trước trong thư mục bin. Application_Start không bị sa thải.
Vin Shahrdar

0

Không có giải pháp nào được mô tả ở trên làm việc cho tôi. Tuy nhiên cài đặt lại gói

Microsoft.CodeDom.Providers.DotNetCompilerPlatform 

sử dụng nuget gui là một cách giải quyết (không quá hay)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.