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:
- đối tượng HostingEnvironment trong IIS
- đối tượng RoleEnvironment trong Azure hoặc Azure Emulator
- System.Environment đối tượng mà bạn có ở khắp mọi nơi.
- 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.