2010-11-22 28 views
47

tôi đã cố gắngLàm thế nào để có được tên máy chủ đầy đủ + số cổng trong Application_Start của Global.aspx?

Uri uri = HttpContext.Current.Request.Url; 
String host = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port; 

và nó hoạt động tốt trên máy tính địa phương của tôi, nhưng khi được xuất bản lên IIS7, có một ngoại lệ nói

System.Web.HttpException: Request is not available in this context 

Bất cứ ai cũng biết làm thế nào để đạt được điều này?

+0

kiểm cho các cổng – TalentTuner

+0

Xem thêm http://stackoverflow.com/a/578083/12484 để có cách thức gọn gàng hơn để có được sơ đồ + máy chủ + cổng từ một URL (một khi bạn có). –

+0

Có vẻ như bạn đang chạy ở chế độ tích hợp, không phải là kiểu cổ điển (mà tôi nghĩ bạn đang chạy trên máy cục bộ). Vấn đề là yêu cầu không có sẵn trong Application_Start trong IIS7. Hãy xem: http://mvolo.com/blogs/serverside/archive/2007/11/10/Integrated-mode-Request-is-not-available-in-this-context-in-Application_5F00_Start.aspx Điều gì giải thích nó độc đáo. –

Trả lời

59

Khi ứng dụng web của bạn bắt đầu, không có yêu cầu HTTP nào được xử lý.

Bạn có thể muốn xử lý xác định phương thức Application_BeginRequest (Object Sender, EventArgs e) trong đó ngữ cảnh Yêu cầu có sẵn.

Edit: Đây là một mẫu mã lấy cảm hứng từ blog của Mike Volodarsky rằng Michael Shimmins liên quan đến:

void Application_BeginRequest(Object source, EventArgs e) 
    { 
     HttpApplication app = (HttpApplication)source; 
     var host = FirstRequestInitialisation.Initialise(app.Context); 
    } 

    static class FirstRequestInitialisation 
    { 
     private static string host = null; 
     private static Object s_lock = new Object(); 

     // Initialise only on the first request 
     public static string Initialise(HttpContext context) 
     { 
      if (string.IsNullOrEmpty(host)) 
      { 
       lock (s_lock) 
       { 
        if (string.IsNullOrEmpty(host)) 
        { 
         var uri = context.Request.Url; 
         host = uri.GetLeftPart(UriPartial.Authority); 
        } 
       } 
      } 

      return host; 
     } 
    } 
+2

Tại sao bỏ phiếu này? Đây là một gợi ý đúng. –

+3

Không nên là 'Uri uri = context.Request.Url;' cũng không thể dòng tiếp theo được đơn giản hóa thành 'uri.GetLeftPart (UriPartial.Authority); ' –

+0

điều này cũng phải là một lớp tĩnh và bạn không không cần phải khởi tạo máy chủ. – Steve

7

Câu trả lời được chấp nhận là tốt, nhưng trong hầu hết các trường hợp (nếu yêu cầu đầu tiên là một HTTP Yêu cầu) bạn nên sử dụng sự kiện Session_Start, được gọi một lần cho mỗi người dùng cứ 20 phút một lần hoặc lâu hơn (không chắc chắn thời gian phiên hợp lệ). Application_BeginRequest sẽ được kích hoạt tại mọi Yêu cầu.

public void Session_Start(Object source, EventArgs e) 
{ 
    //Request/Request.Url is available here :) 
} 
-1

Chỉ cần trả lời này vì vậy nếu ai đó bao giờ quyết định để thực sự tìm kiếm về chủ đề này ...

này hoạt động trên bắt đầu ứng dụng trong bất kỳ chế độ ...

typeof(HttpContext).GetField("_request", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(HttpContext.Current) 
+2

xin lưu ý rằng trường không công khai (tức là riêng tư). Bạn nên rất cẩn thận khi sử dụng các tính năng và trường không được tài liệu vì chúng có thể thay đổi mà không cần thêm thông tin. –

+0

Và nó khác với 'HttpContext.Current.Request' ??? Tôi thấy kết quả tương tự – Andrii

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