2009-10-31 29 views
49

私のASP.NET Webアプリケーションでは、IIS固有のものであるIISで作成された名前を調べたいと思います。私はウェブサイトのドメイン名に興味がありませんでしたが、IISのサイトに与えられた実際の名前です。ASP.NET WebサイトからIISサイト名を取得

私は私がいないドメイン名ではなく、仮想ディレクトリのパスを、IISで指定された名前について話して明確にするためにIIS6のために確実にそれを行うことができる必要があり、7

。ここで

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

+0

の下に使用することができますか? –

+1

私は書いたWebアプリケーションのライセンスを取得しています。ライセンスキーが同じサーバー上であってもWebアプリケーションごとに1回だけ使用されるようにする必要があります。 Webアプリケーションは、IISサイトに割り当てられた複数のドメイン名で動作するため、サイトのドメイン名にキーをバインドすることはできません。 同じマシン上に複数のクライアントがインストールされているため、同じ名前のバインドではマシン名のキーはどちらの方法も実行しません。 要するに、私は、特定のマシン上のIIS Webサイトを一意に識別する何かが必要です。 IISは同じ名前の複数のサイトを許可していないので、私はその方法を理解しています。 –

+0

私は耳を傾けることをやめることを意味しなかった、私は誰かがそれをしたいと思う理由が不思議です。 –

答えて

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

の複製ではありません。それはまさに私が探していたものです。どうもありがとうございます。 IIS6と7の両方で動作するかどうかは分かりますか? –

+0

申し訳ありませんが、私はIIS 6でそれをテストしていません。 –

+1

私はIIS 7/5.1のためにそれをテストしました、私はそれがIIS 6(90%)のために働くと思います。 –

10

はサイトIDを取得中related postです。

ここではあなたのために働くかもしれないいくつかのコード:

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"); 
    } 

}

はここoriginal postへのリンクです。

IIS7で動作するかどうかはわかりませんが、IIS7用のIIS6互換コンポーネントをインストールすると動作するはずです。

9

あなたは、IIS 7.0構成システムへのアクセスを読み書き提供ServerManagerMicrosoft.Web.Administration)を探しています。

Microsoft.Web.Administration.SiteCollectionを繰り返し、サイトオブジェクトを使用してWebサイトへの参照を取得し、Nameプロパティの値を読み取ります。

// 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 
} 

ます。またServerManager.Sitesコレクションを照会するLINQを使用することができます

// 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(); 
     } 

注意(以下の例を参照):Microsoft.Web.AdministrationはのみIIS7に動作します。

IIS6の場合は、ADSIとWMIの両方を使用できますが、ADSIよりも高速なWMIを使用することをお勧めします。 WMIを使用している場合は、WMI Code Creator 1.0(Microsoftによって無料/開発)をご覧ください。それはあなたのためのコードを生成します。

HTH

0

リモートサーバーに接続するときは、最初にServerManager.OpenRemote(「サーバー名」)実行する必要があります。

基本的に@belugabobとしてこの

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

      } 

see msdn help

10

のようなものをやって@CarlosAgが既にIApplicationHost.GetSiteNameメソッドを直接呼び出されることを意図されていないので、私はむしろSystem.Web.Hosting.HostingEnvironment.SiteNameの代わりSystem.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName()を使用したい言及!(msdn

HostingEnvironment.SiteNameプロパティを使用する方が良いです!私は、これはドキュメントに関してで正解であるべきだと思う(msdn

;)

+1

これを指摘してくれてありがとう。私のケースでは、System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName()が機能しましたが、シリアライズされた「タイプがメンバーのために解決されません」という問題が発生しました。 HostingEnvironment.SiteNameに切り替えた後、それはなくなった。私はそれがMarshalByRefObjectと何か関係があると仮定します。 HostingEnvironment.SiteNameに切り替えると、この問題が解決されました。 –

0

あなたがモチベーションにもう少し手の込んだコード

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; 
} 
関連する問題