2014-11-30 16 views
5

Lưu ý: Điều này khác với câu hỏi phát hiện chạy cục bộ so với vai trò Azure, mà tôi hiểu đã được trả lời rồi.Làm thế nào để phát hiện nếu trang ASP.NET đang chạy cục bộ, trong vai trò web xanh, hoặc trang web xanh?

Tôi có ứng dụng APS.NET MVC mà tôi triển khai sang Azure. Tôi đang chạy V2.5 của công cụ Azure. Tôi muốn để có thể phát hiện được trong ba kịch bản sau đây mã đang chạy trong:

cục bộ (gỡ lỗi trên IIS), trang web của Azure hoặc vai trò web Azure

Tôi đã nhìn thấy trong khác đăng đề xuất sử dụng các mục sau:

RoleEnvironment.IsAvailable 

Tuy nhiên, đây có vẻ là giải pháp không đầy đủ cho nhu cầu của tôi. Dường như nó phát hiện xem mã đang chạy cục bộ hay là vai trò web không có vấn đề gì. Tuy nhiên, nó dường như không bao gồm các kịch bản kiểm tra để chạy như một trang web azure. Không chỉ nó không bao gồm này, nhưng cố gắng để kiểm tra tài sản đó khi chạy trong một trang web Azure làm cho nó nổ với:

Ngoại lệ cơ hội đầu tiên của loại 'System.IO.FileLoadException' xảy ra trong mscorlib.dll

Additional information: Could not load file or assembly 
'Microsoft.WindowsAzure.ServiceRuntime, Version=2.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. 
The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) 

Vì vậy, bất kỳ ai cũng có thể cho tôi biết cách phát hiện giữa ba trường hợp này?

Trả lời

4

Cách tốt nhất tôi đã đi qua để xác định xem bạn đang chạy trên một trang web Azure là để kiểm tra sự hiện diện của một biến môi trường cụ thể cho Azure trang web như WEBSITE_SITE_NAME. Bạn có thể kiểm tra điều này trước tiên và nếu biến không tồn tại, hãy tiến hành kiểm tra RoleEnvironment.IsAvailable.

Xem this answer để biết thêm chi tiết cụ thể.

1

Hãy để tôi cung cấp cho bạn một cách tiếp cận khác sẽ cho bạn biết nếu bạn đang ở Azure, Azure Emulator, IIS hoặc thử nghiệm tích hợp chạy cục bộ. Điều này là quan trọng bởi vì nó là hữu ích và nhanh hơn để gỡ lỗi trong IIS thể hiện các dự án web thuần túy mà bạn cuối cùng sẽ chạy trong Azure hoặc chạy thử nghiệm tích hợp có thể chạy ngay cả bên ngoài IIS. Có nghĩa là bạn có thể gỡ lỗi dự án của bạn nhanh hơn và không lãng phí tất cả thời gian tải/chạy bộ mô phỏng tính toán azure mỗi lần.

Có một số cách để kiểm tra điều này và điều đó nhưng đây là một phương pháp khác có thể giúp bạn di chuyển trong tất cả các trường hợp để có ALM và phát triển tốt.

Bạn có bốn cơ chế sẵn để sử dụng:

  1. đối tượng HostingEnvironment trong IIS
  2. đối tượng RoleEnvironment trong Azure hoặc Azure Emulator
  3. System.Environment đối tượng mà bạn có ở khắp mọi nơi.
  4. Cấu hình - Trong trường hợp của tôi là web.config, web.debug.config, web.release.config, web.debug.staging.config, web.release.production.config, app.config, ServiceConfiguration.Local.cscfg, ServiceConfiguration.CloudStaging.cscfg và ServiceConfiguration.CloudProduction.cscfg

Vấn đề bao gồm trong đó: Nếu bạn cố gắng truy cập RoleEnvironment.IsAvailable hoặc RoleEnvironment.IsEmulated trong IIS mà không chạy trong Emulator hoặc trong Azure - bạn sẽ nhận được một ngoại lệ. Trong bộ mô phỏng Azure với IIS cũng sẽ nhận được một ngoại lệ nếu môi trường chưa sẵn sàng - Trình mô phỏng và IIS đang chạy cùng nhau và IIS không đợi trình giả lập ngay cả khi bạn đi qua RoleEntryPoint trước khi bạn tới Global.asax.cs. 'Điều này' loại bỏ khả năng chờ đợi như vậy

while(!RoleEnvironment.IsAvailable) 

và giải quyết vấn đề nhanh chóng và sạch sẽ. Vấn đề này cũng loại bỏ việc sử dụng RoleEnvironment.IsEmulated vì nó sẽ ném ngoại lệ trong IIS cục bộ hoặc thử nghiệm tích hợp cục bộ và không thể kiểm tra RoleEnvironment.IsAvailable trước nó bởi vì nếu bạn đợi nó sẵn sàng bên ngoài Azure hoặc Azure Emulator bạn sẽ chờ đợi cái gì đó sẽ có mặt ở đó.

Lưu ý bên: Đôi khi trong môi trường giả lập có thể tải sau đó dự án MVC của bạn và truy cập các thuộc tính RoleEnvironment ném ngoại lệ. Điều này có thể được giảm thiểu dễ dàng bằng cách chờ đợi bằng cách gọi số

while(!RoleEnvironment.IsAvailable) 

Cuối lưu ý.

Side note 2 Thiết lập biến môi trường trong RoleEntryPoint như thế:

public class WebRole : RoleEntryPoint 
{ 
    public override bool OnStart() 
    { 
     Environment.SetEnvironmentVariable("CodeRunsInAzure","true"); 
    } 
} 

sẽ không làm việc vì they run in different places và bạn không thể lấy nó như thế:

Environment.GetEnvironmentVariable("CodeRunsInAzure") 

trong Global.asax.cs hoặc ở nơi khác trong dự án Web/Công nhân của bạn. Nếu không, vấn đề sẽ được giải quyết dễ dàng.

End của mặt lưu ý 2.

Giải pháp là trong hai phần. Đầu tiên là trong các tập tin cấu hình của bạn. Chỉ cần đặt biến trong tất cả các bạn configs của bạn trong đó nó là cần thiết - * .cscfgs:

<Setting name="RunsInAzureCloudEnv" value="true/false"/> 

trong ServiceConfiguration.Local.cscfg - sai và ở khắp mọi nơi khác trong cscfg - đúng. Sau đó, trong web. *. Config/app.config phù

<add key="RunsInAzureCloudEnv" value="true/false"/> 

Bằng cách này, biến sẽ được thiết lập là true chỉ khi bạn xuất bản hoặc bạn chạy nó trong giả lập nếu không nó sẽ là sai lầm.

Một trường hợp sử dụng này là khi bạn muốn chạy mã chỉ trong Azure - như cập nhật Ấn bản cơ sở dữ liệu cũ của bạn từ phiên bản WEB đã nghỉ hưu sang BASIC bên trong triển khai tùy chỉnh IDatabaseInitializer của bạn. Trong trường hợp này, bạn chỉ cần chạy mã của bạn trong Azure và chỉ khi nó không có trong trình giả lập nhưng trong môi trường dàn dựng hoặc sản xuất của bạn. Việc sử dụng ví dụ là như sau:

// check the variable that is set only in azure environment 
var runsInAzureEnvStr = CloudConfigurationManager.GetSetting("RunsInAzureCloudEnv"); 
bool runsInAzureEnv = false; 
Boolean.TryParse(runsInAzureEnvStr, out runsInAzureEnv); 

if(!runsInAzureEnv) 
{ 
    return; 
} 

Nếu chỉ Emulator đã sẵn sàng trước khi MVC chỉ đã được đưa ra: if (! RoleEnvironment.IsAvailable & & RoleEnvironment.IsEmulated) sẽ là đủ. Nếu ai đó biết làm thế nào để làm cho hai xảy ra trong trình tự chính xác và chia sẻ nó - nó sẽ được tốt đẹp.

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