2010-06-02 43 views
38

Tôi đang cố gắng để gọi RoleEnvironment.GetConfigurationSetting("SOMEKEY") như vậy:Tại sao tôi nhận được SEHException khi gọi RoleEnvironment.GetConfigurationSettingValue ("MYKEY")?

public partial class AzureBasePage : System.Web.UI.Page 
{ 
    protected ChargifyConnect Chargify 
    { 
     get { 
      if (this._chargify == null) { 
       this._chargify = new ChargifyConnect(); 
       this._chargify.apiKey = RoleEnvironment.GetConfigurationSettingValue("CHARGIFY_API_KEY"); 
      } 
      return this._chargify; 
     } 
    } 
    private ChargifyConnect _chargify = null; 
} 

chính ServiceConfiguration.cscfg của tôi trông như thế này:

<Setting name="CHARGIFY_API_KEY" value="AbCdEfGhIjKlMnOp" /> 

Và tôi nhận được lỗi này:

Exception Details: System.Runtime.InteropServices.SEHException: External component has thrown an exception.

[SEHException (0x80004005): External component has thrown an exception.] RoleEnvironmentGetConfigurationSettingValueW(UInt16* , UInt16* , UInt32 , UInt32*) +0 Microsoft.WindowsAzure.ServiceRuntime.Internal.InteropRoleManager.GetConfigurationSetting(String name, String& ret) +92 Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetConfigurationSettingValue(String configurationSettingName) +67 ChargifyNET.ChargifyAzurePage.get_Chargify() in C:\NetProjects\ChargifyDotNET\Source\Chargify.NET\ChargifyAzurePage.cs:26 Chargify.Azure._Default.Page_Load(Object sender, EventArgs e) in C:\NetProjects\ChargifyDotNET\Source\Chargify.Azure\Default.aspx.vb:8 System.Web.UI.Control.OnLoad(EventArgs e) +99 System.Web.UI.Control.LoadRecursive() +50 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627

+0

Trả về 'Marshal.GetExceptionCode()' khi bạn ở trong khối catch cho 'SEHException' là gì? –

+0

Nó trả về "-1066598274" khi gọi 'Marshal.GetExceptionCode()' – Kori

+0

Bạn có chắc là bạn đang chạy dưới Windows Azure? (Dev vải hoặc trong các đám mây thực sự?) – smarx

Trả lời

82

Bạn sẽ có được SEHException nếu bạn cố gắng truy cập RoleEnvironment nếu bạn không chạy trong vải dev hoặc vải Azure. Tôi tin rằng bạn đang vô tình chạy trang web của bạn theo máy chủ phát triển asp.net, có nghĩa là bạn không có trong vải dev (Tôi đã xác nhận rằng điều này sẽ ném một SEHException). Nói cách khác, bạn đã thiết lập dự án trang web của mình làm dự án khởi động hoặc bạn đã nhấp chuột phải vào dự án đó và yêu cầu nó chạy.

Bạn phải đặt chính dự án đám mây làm dự án khởi động, sau đó sẽ hiển thị trang web của bạn chạy trên cổng 81 theo mặc định. Dự án đám mây là dự án có, như các thành viên của nó, tất cả các định nghĩa vai trò của bạn. Bạn có thể xem thanh URL của trình duyệt và dễ dàng biết liệu bạn có đang chạy trên máy chủ asp.net dev hay không, bởi vì bạn sẽ có một số cổng ngẫu nhiên thay vì cổng 81.

Bạn nên đảm bảo chạy trong vải dev hoặc vải Azure bằng cách kiểm tra RoleEnvironment.IsAvailable. Nếu đó là sự thật, bạn an toàn để gọi bất cứ điều gì trong RoleEnvironment. Nếu nó sai, bạn không chạy trong vải.

+0

Cảm ơn. Đó là một câu trả lời hay, tôi sẽ xác nhận - nhưng tôi chắc chắn là vậy. – Kori

+1

Chỉ cần một nhận xét khác về độ phân giải của câu hỏi này, tôi đã tạo một thư viện cần chạy trong cả môi trường Azure và không phải Azure - vì vậy tôi không thể tham khảo trực tiếp RoleEnvironment. Tuy nhiên tôi đã sử dụng sự phản chiếu để xác định giá trị của RoleEnvironment.IsAvailable() – Kori

+2

Một quan sát nhỏ: RoleEnvironment.IsAvailable là một thuộc tính, không phải là một phương thức. –

1

Để theo dõi về điều đó, chỉ trong trường hợp ai đó gặp phải vấn đề tương tự một lần nữa, nó cũng có thể là trường hợp vì bất kỳ lý do nào mà một trong các triển khai của bạn gặp khó khăn trong trình mô phỏng tính toán.

Điều gì đã xảy ra với tôi là tôi đã có một webrole chứa nhiều trang web, mỗi trang web được liên kết với một tên máy chủ khác nhau. Nói: localhost và test.localhost. Thông thường, bạn sẽ truy cập chúng tại localhost: 81 và test.localhost: 81. Tuy nhiên, vì một số lý do lạ, một triển khai đã trở thành một trạng thái lạ khi nó được liệt kê trong trình mô phỏng tính toán, không có Visual Studio gỡ lỗi nó, nó sẽ nói "Role Instance destroy" hoặc một thứ gì đó dọc theo các dòng đó. các trang web được triển khai trong IIS. Sau đó, tôi không biết về việc triển khai lỗi này, truy cập các url mặc định, ví dụ: test.localhost: 81 sẽ tải lên các tệp triển khai cũ. Các (cũ) trang web làm việc cho đến khi tôi mở một trang mà thực sự sử dụng phương pháp RoleEnvironment.GetConfigurationSettingValue, và chỉ sau đó tôi có ngoại lệ đó. Nó thực sự bực bội vì việc triển khai boggus obvioulsy này không ảnh hưởng đến bất kỳ điểm ngắt nào cũng như không vi phạm các ngoại lệ, nhưng nó trông chính xác như trang web tôi đang làm việc ..

Khi tôi nhận ra điều này, tôi đã mở các tên máy chủ theo cổng mới và các trang hoạt động như mong đợi. Khi tôi gỡ bỏ triển khai lỗi này khỏi trình mô phỏng tính toán, các trang web IIS cũng đã bị xóa và may mắn là các cổng hiện có sẵn để sử dụng như mong đợi ..

0

Nếu bạn gặp lỗi tương tự sau khi đảm bảo rằng bạn đang chạy vải dev, hãy thử giảm số lượng cá thể xuống một. Điều đó đã sửa nó cho tôi.

Tuy nhiên, có vẻ lạ mà tôi không thể gỡ lỗi với 2 trường hợp.

2

Xóa thẻ <Sites> trong tệp ServiceDefinition.csdef có thể là một giải pháp cho bạn như đối với chúng tôi nhưng sau đó trang web của bạn sẽ không được triển khai cho Full IIS trên đám mây. Chúng tôi đang sử dụng 1,7 của SDK.

Vì vậy, tóm tắt: RoleEnvironment.IsAvailable = False với điều này bao gồm trong số ServiceDefinition.csdef với số lượng ví dụ là 1 tôi có thể thêm.

<Sites> 
     <Site name="Blah"> 
     <Bindings> 
      <Binding name="Endpoint1" endpointName="Http" /> 
      <Binding name="Endpoint1" endpointName="Https" /> 
     </Bindings> 
     </Site> 
</Sites> 

Xóa nút <Sites> và triển khai và bạn có thể thấy rằng bây giờ RoleEnvironment.IsAvailable = True.

Có rất ít nhật ký về những gì đang thực sự xảy ra - trang web đang chạy tốt, không có cảnh báo ngoại trừ thông thường bạn chỉ có 1 trường hợp tại sao không triển khai 2 và trang web vẫn hoạt động tốt.

Đây là sự cố gần đây và tôi tin rằng phải có một số thay đổi được thực hiện trong msshrtmi.dll đó. Nó có thể đăng nhập nhiều hơn một chút về những gì thực sự có thể là vấn đề nếu RoleEnvironment không có sẵn.

0

Mặc dù nhiều chỉ ra rằng bạn nên chạy với dev/vải Azure thay vì máy chủ phát triển asp.net, tôi nghĩ rằng nó đáng nói rằng bạn cần phải chọn đúng thực hiện mô hình khi bạn xuất bản ứng dụng của bạn để Azure nếu bạn muốn sử dụng RoleEnvironment.

Như vậy là 3 mô hình như bây giờ:

  • VM
  • trang web
  • đám mây Dịch vụ

Vui lòng tham khảo ở đây: http://azure.microsoft.com/en-us/documentation/articles/fundamentals-application-models để biết thêm chi tiết.

Và đặc biệt là đoạn sau đây:

Cloud Services, which was the initial execution model provided by Azure, is an explicitly PaaS approach. While the line between PaaS and web hosting is blurry, Cloud Services differs in some important ways from Web Sites, including the following:

  • Unlike Web Sites, Cloud Services gives you administrative access to your application's VMs. This lets you install arbitrary software that your application needs, something that's not possible with Web Sites.
  • Because Cloud Services offers both web roles and worker roles, it's a better choice than Web Sites for multi-tier applications that need separate VMs for their business logic.
  • Cloud Services provides separate staging and production environments, making application updates somewhat smoother than Web Sites.
  • Unlike Web Sites, you can use networking technologies such as Azure Virtual Network and Azure Connect to hook on-premises computers to Cloud Services applications.
  • Cloud Services lets you use Remote Desktop to connect directly to an application's VMs, something that's not possible with Web Sites.

Bạn có thể kiểm tra RoleEnvironment.IsAvailable. Nếu nó sai, ứng dụng của bạn không chạy với thời gian chạy Azure, có nghĩa là không thể áp dụng RoleEnvironment.

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