2009-10-31 58 views
49

Trong ứng dụng web ASP.NET của tôi, tôi muốn tìm kiếm tên nó đã được cung cấp khi nó được tạo trong IIS, là duy nhất cho máy chủ. Tôi không quan tâm đến tên miền cho trang web nhưng tên thực tế được cung cấp cho trang web trong IIS.Nhận tên trang web IIS từ một trang web ASP.NET

tôi cần để có thể làm điều đó đáng tin cậy cho IIS6 và 7.

Để được rõ ràng tôi đang nói về cái tên được đưa ra trong IIS, không phải là tên miền và không phải là đường dẫn thư mục ảo.

Value from IIS I'd like to read from C# http://img252.imageshack.us/img252/6621/capturedz.png

+0

bạn có thể xây dựng thêm một chút về động lực? –

+1

Tôi đang cấp phép cho một ứng dụng web tôi đã viết và tôi cần đảm bảo rằng khóa cấp phép chỉ được sử dụng một lần cho mỗi ứng dụng web ngay cả trên cùng một máy chủ. Ứng dụng web hoạt động với nhiều tên miền được gán cho trang IIS để gắn kết khóa với tên miền của trang web sẽ không hoạt động. Trong cùng một ràng buộc, khóa của tên máy sẽ không hoạt động vì ứng dụng của tôi có thể được cài đặt cho nhiều máy khách trên cùng một máy. Tóm lại, tôi cần một thứ gì đó xác định duy nhất trang web IIS trên một máy cụ thể. Vì IIS không cho phép nhiều trang web có cùng tên, tôi nghĩ đó là con đường để đi. –

+0

Tôi đã không có ý định đi xuống âm thanh condescending, tôi chỉ tò mò tại sao một người nào đó muốn làm điều đó. –

Trả lời

55
System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName(); 
+0

Đó chính xác là những gì tôi đang tìm kiếm. Cảm ơn bạn rất nhiều. Bạn có biết nó hoạt động cho cả IIS6 và 7 không? –

+0

Xin lỗi, tôi đã không thử nghiệm nó trong IIS 6. –

+1

Tôi đã thử nghiệm nó cho IIS 7/5.1 một vài phút tuổi, tôi nghĩ rằng nó hoạt động cho IIS 6 (90%). –

10

Đây là một related post để lấy về các trang web Id.

Dưới đây một số mã có thể làm việc cho bạn:

using System.DirectoryServices; 
using System; 

public class IISAdmin 
{ 
    public static void GetWebsiteID(string websiteName) 
    { 
     DirectoryEntry w3svc = new DirectoryEntry("IIS://localhost/w3svc"); 

    foreach(DirectoryEntry de in w3svc.Children) 
    { 
     if(de.SchemaClassName == "IIsWebServer" && de.Properties["ServerComment"][0].ToString() == websiteName) 
     { 
      Console.Write(de.Name); 
     } 

    } 

    } 
    public static void Main() 
    { 
    GetWebsiteID("Default Web Site"); 
    } 

}

Dưới đây là các liên kết đến các original post.

Tôi không chắc chắn nếu nó sẽ làm việc trên IIS7, nhưng nếu bạn cài đặt các thành phần tương thích IIS6 cho IIS7 nó sẽ làm việc.

9

Bạn đang tìm kiếm ServerManager (Microsoft.Web.Administration) mà cung cấp đọc và viết truy cập vào các hệ thống cấu hình IIS 7.0.

Lặp lại thông qua Microsoft.Web.Administration.SiteCollection, nhận tham chiếu đến trang web của bạn bằng cách sử dụng Đối tượng trang web và đọc giá trị của thuộc tính Tên.

// Snippet   
using (ServerManager serverManager = new ServerManager()) { 

var sites = serverManager.Sites; 
foreach (Site site in sites) { 
     Console.WriteLine(site.Name); // This will return the WebSite name 
} 

Bạn cũng có thể sử dụng LINQ để truy vấn bộ sưu tập ServerManager.Sites (xem ví dụ dưới đây)

// Start all stopped WebSites using the power of Linq :) 
var sites = (from site in serverManager.Sites 
      where site.State == ObjectState.Stopped 
      orderby site.Name 
      select site); 

     foreach (Site site in sites) { 
      site.Start(); 
     } 

Note: Microsoft.Web.Administration làm việc chỉ với IIS7.

Đối với IIS6 bạn có thể sử dụng cả ADSI và WMI để thực hiện việc này, nhưng tôi khuyên bạn nên sử dụng WMI nhanh hơn ADSI. Nếu sử dụng WMI, hãy xem WMI Code Creator 1.0 (Miễn phí/Phát triển bởi Microsoft). Nó sẽ tạo mã cho bạn.

HTH

0

Trước tiên, bạn cần phải thực hiện ServerManager.OpenRemote ("tên máy chủ") khi kết nối với máy chủ từ xa.

Về cơ bản làm một cái gì đó như thế này

  using (ServerManager srvMgr = ServerManager.OpenRemote("serverName")) 
      { 

      } 

see msdn help

10

Như @belugabob và @CarlosAg đã đề cập Tôi muốn sử dụng System.Web.Hosting.HostingEnvironment.SiteName thay vì System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName() bởi vì phương pháp IApplicationHost.GetSiteName không có ý định để được gọi trực tiếp !(msdn)

Vì vậy, bạn nên sử dụng tài sản HostingEnvironment.SiteName! (msdn)

Tôi nghĩ rằng đây sẽ là câu trả lời đúng trong mối liên quan với tài liệu hướng dẫn;)

+1

Cảm ơn bạn đã chỉ ra điều này. Trong trường hợp của tôi System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName() làm việc, nhưng sau đó tôi chạy vào một weired "Loại không được giải quyết cho thành viên" với serialization, mà tôi đã không thể theo dõi. Sau khi chuyển sang HostingEnvironment.SiteName nó đã biến mất. Tôi giả sử nó có một cái gì đó để làm với MarshalByRefObject không tương thích với Serialization. Chỉ trong trường hợp ai đó bị tấn công bởi điều này, chuyển sang HostingEnvironment.SiteName đã giải quyết vấn đề đó. –

0

Bạn có thể sử dụng mã dưới đây

private string WebsiteName() 
{ 
    string websiteName = string.Empty; 
    string AppPath = string.Empty; 
    AppPath = Context.Request.ServerVariables["INSTANCE_META_PATH"]; 
    AppPath = AppPath.Replace("/LM/", "IIS://localhost/"); 
    DirectoryEntry root = new DirectoryEntry(AppPath); 
    websiteName = (string)root.Properties["ServerComment"].Value; 
    return websiteName; 
} 
Các vấn đề liên quan