狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#操作IIS完整解析

admin
2018年9月8日 17:22 本文熱度 6512

最近在為公司實施做了一個工具,Silverlight部署早已是輕車熟路,但對于非技術(shù)人員來說卻很是頭疼的一件事,當?shù)浆F(xiàn)場實施碰到客戶情況也各不相同,急需一個類似系統(tǒng)備份的"一鍵工具"快速實現(xiàn)應(yīng)用程序部署和數(shù)據(jù)庫進行關(guān)聯(lián)。網(wǎng)上關(guān)于這方面資源也比較混亂,其中對于IIS的編程影響因素很多,操作技巧上加以細化小結(jié)。

A:版本問題

這是你在進行編程前必須要要考慮的一個實際問題,因為IIS版本不同對應(yīng)編程上基本上完全不同方式來進行的,先了解一下Iss版本在操作系統(tǒng)個具體要求:

ISS6.0時代主要以using System.DirectoryServices空間下的 DirectoryEntry 對象作為編程訪問一個主要載體,但隨著ISS7.0發(fā)布.NET的Web程序由ISS6.0開始逐漸過渡到 7.0 版本,而且在編程控制ISS上新添加的Microsoft.Web.Administration名稱空間,提出多個用于管理 操作和訪問ISS的對象,使操作ISS的編程更加簡潔高效。

B:我們要做什么

實際用戶操作環(huán)境中主要以Windows XP/2000/2003操作系統(tǒng)為主,這就導致了ISS版本主要在5.0/5.1/6.0之間,所以本次演示的代碼編程實例都是ISS7.0版本以下(不包含Iss7.0)。

為了達到演示目的,我們現(xiàn)在需求是這樣的:把硬盤上Silverlight應(yīng)用程序成功部署到本地機器ISS上,并支持通過局域網(wǎng)訪問,需求很簡單吧,就是一句話,其實當進入實際編程時因為客戶的局域網(wǎng)環(huán)境是不可預(yù)知的,這也就導致影響部署Silverlight程序到ISS上諸多未知因素,所以要在編程中使Silverlight應(yīng)用程序部署成功,我們必須利用編程除了控制ISS外還要控制其他主要影響ISS因素。

C:進入編程

既然提出需求我們大概確定一下解決思路:

在默認站點下創(chuàng)建一個虛擬目錄承載Silverlight 應(yīng)用程序,新建的虛擬目錄運行在獨立應(yīng)用程序池中,支持本地局域網(wǎng)匿名訪問其實就是對訪問權(quán)限控制,為了直接使更改的應(yīng)用生效需要多次重新啟動ISS的服務(wù),這就需要對ISS服務(wù)進行編程控制。

<1>ISS版本的獲取

在進入客戶環(huán)境前我們先檢測下是否存在安裝了ISS,以及ISS版本獲取提示,目前獲取ISS版本的方式主要有兩種,第一種方法是通過遍歷DirectoryEntry實體目錄,第二種方式是通過獲取注冊表的ISS修改版本值[經(jīng)測試這種方式獲取版本不穩(wěn)定]。

public static void GetIssVersionByDri(string domainname)
{      
    try
     {
         if (string.IsNullOrEmpty(domainname))
         {
           //如果為空 則默認為本地機器
             domainname = "LOCALHOST";
         }
        DirectoryEntry getEntity=new DirectoryEntry("IIS://" + domainname + "/W3SVC/INFO");
        string Version=getEntity.Properties["MajorIISVersionNumber"].Value.ToString();
        MessageBox.Show(Version);
    }
    catch (Exception se)
    {
        //說明一點:IIS5.0中沒有(int)entry.Properties["MajorIISVersionNumber"].Value;屬性,將拋出異常 證明版本為 5.0
        MessageBox.Show("獲取ISS的版本是發(fā)生異常信息:"+se.Message);
    }
}

通過系統(tǒng)注冊表獲取ISS版本的值[測試發(fā)現(xiàn)不穩(wěn)定]:

public static string GetIssVersion()
{
  //RegistryKey表示 Windows 注冊表中的項級節(jié)點.此類是注冊表封裝
  string issversion = string.Empty;
  RegistryKey getkey = Registry.LocalMachine.OpenSubKey("software\\microsoft\\inetstp");
  if (getkey != null)
  {
    issversion= Convert.ToInt32(getkey.GetValue("majorversion", -1)).ToString();
    MessageBox.Show(issversion.ToString());
  }
  return issversion;
}

<2>創(chuàng)建虛擬目錄

每個Internet服務(wù)可以從多個目錄中發(fā)布,通過以通用命名約定 (UNC) 名、用戶名及用于訪問權(quán)限的密碼指定目錄,可將每個目錄定位在本地驅(qū)動器或網(wǎng)絡(luò)上,虛擬目錄可以一個宿主程序,這可發(fā)布的操作目錄即為虛擬目錄,再來看看在ISS6.0中創(chuàng)建的虛擬目錄的步驟和控制的屬性。

新建虛擬目錄:

/// <summary>
 /// 添加一個虛擬目錄
 /// </summary>
 public void CreateVirtualDir(string virtualdirname, string logicDir)
 {
     //如果存在重復 就直接刪除虛擬目錄
     if (IsExitesVirtualDir(virtualdirname))
         DeleteVirtualDir(virtualdirname);

    DirectoryEntry rootEntry;
    rootEntry = new DirectoryEntry("IIS://localhost/W3SVC/1/root");

    DirectoryEntry newVirDir;
    newVirDir = rootEntry.Children.Add(virtualdirname, "IIsWebVirtualDir");
    newVirDir.Invoke("AppCreate", true);

    newVirDir.CommitChanges();
   rootEntry.CommitChanges();

    newVirDir.Properties["AnonymousPasswordSync"][0] = true;
    newVirDir.Properties["Path"][0] = logicDir;//+ @"virtualdirentry\virtualname\";

    //設(shè)置的端口綁定數(shù)據(jù)
    //_newVirDir.Properties["ServerBindings"].Value =AppEntitys.WebAppInfor.HostIp+AppEntitys.WebAppInfor.HostProt+AppEntitys.WebAppInfor.AppDesc;

    //設(shè)置起始默認頁:
    newVirDir.Properties["EnableDefaultDoc"][0] = true;
    newVirDir.Properties["DefaultDoc"][0] = "Default.aspx";

    //_newVirDir
    newVirDir.CommitChanges();
}

這個方法在創(chuàng)建時主要有兩個參數(shù):一個是新建虛擬目錄名稱,另外一個要部署Silverlight應(yīng)用程序物理路徑,在獲取根節(jié)目錄時需要制定ISS的路徑,ISS的路徑格式。如:IIS://ComputerName/Service/Website/Directory

找到根目錄后,添加新建虛擬目錄,制定參數(shù)為Schema-指每個結(jié)點的類型IIsVirtualDir:——虛擬目錄 IIsWebDir :——普通目錄,添加完成后調(diào)用ADSI中的"AppCreate"方法將目錄真正創(chuàng)建,創(chuàng)建完成后通過根目錄和新目錄提交保存。

<3>目錄屬性設(shè)置

在DirectoryEntity虛擬目錄屬性可以說是非常多的,當時在編程時我為了區(qū)分屬性間區(qū)別做了一個方法去遍歷整個屬性集合PropertyCollection,然后把常用重要的屬性跳出來進入賦值設(shè)置,因為關(guān)于虛擬目錄的屬性在MSDN上的API中并沒有直接提到,特別是對虛擬目錄訪問權(quán)限控制非常重要屬性等,先說明局部的常用的屬性:

例如修改程序起始頁:

//設(shè)置起始默認頁:
newVirDir.Properties["EnableDefaultDoc"][0] = true;
newVirDir.Properties["DefaultDoc"][0] = "Default.aspx,Index.Html,index.asp";
newVirDir.CommitChanges();

DefaultDoc選項可以支持多個,但注意選擇性排序,一般修改目錄屬性后都選通過CommitChanges()方法提交保存,但有時你會發(fā)現(xiàn)我明明修改屬性,卻沒有保存生效,這是因為ISS中部分屬性設(shè)置需要重新啟動ISS服務(wù)才能生效,這個時候我們需要對ISS服務(wù)進行控制。

<4>ISS服務(wù)控制

關(guān)于ISS服務(wù)控制微軟提供一個命名空間System.ServiceProcess 提供能夠快速操作本地系統(tǒng)服務(wù)API,對于ISS服務(wù)控制我們最常用的是重新啟動使當前設(shè)置生效,在設(shè)置服務(wù)時我先找到服務(wù)名稱,打開計算機管理,在服務(wù)和應(yīng)用程序目錄下打開服務(wù)。

我們能看到ISS服務(wù)命名是:ISSAdmin 我們通過編碼來控制:啟動ISS。

//獲取IIS Serivcer控制聲明 . 參數(shù)為Server在系統(tǒng)標識該服務(wù)的簡稱,.
ServiceController getservicecon = new ServiceController("IISADMIN");
getservicecon.Start();

重啟/暫停/停止ISS服務(wù):

if (getservicecon.Status == ServiceControllerStatus.Running)
{
  //停止服務(wù)
  getservicecon.Stop();
  //暫停服務(wù)
  getservicecon.Pause();
  //重啟服務(wù)
  //Process提供對本地和遠程進程的訪問并使您能夠啟動和停止本地系統(tǒng)進程
  //利用Start方法調(diào)用:啟動(或重用)此 Process 組件的 StartInfo 屬性指定的進程資源,并將其與該組件關(guān)聯(lián)
  //如果啟動了進程資源,則為 true;如果沒有啟動新的進程資源(例如,如果重用了現(xiàn)有進程),則為 false
  //通過指定文檔或應(yīng)用程序文件的名稱來啟動進程資源,并將資源與新的 Process 組件關(guān)聯(lián)
  Process.Start("iisreset");
}

如上就是簡單利用編程有效控制ISS服務(wù)運行狀態(tài)。

<5>應(yīng)用程序池創(chuàng)建與控制

ISS應(yīng)用程序池是將一個或多個應(yīng)用程序鏈接到一個或多個工作進程集合的配置。因為應(yīng)用程序池中的應(yīng)用程序與其他應(yīng)用程序被工作進程邊界分隔,所以某個應(yīng)用程序池中的應(yīng)用程序不會受到其他應(yīng)用程序池中應(yīng)用程序所產(chǎn)生的問題的影響,當我們新建一個應(yīng)用程序時,有時客戶端環(huán)境我們無法清除預(yù)知,為了盡量減少影響ISS設(shè)置外在因素,我們把新建虛擬目錄放到一個獨立應(yīng)用程序池中。

當創(chuàng)建一個虛擬目錄后,也同時創(chuàng)建一個程序池把虛擬目錄放到其中:

/// <summary>
/// 建立程序池后關(guān)聯(lián)相應(yīng)應(yīng)用程序及虛擬目錄
/// </summary>
public static void SetAppToPool(string appname)
{
  //獲取目錄
  DirectoryEntry getdir = new DirectoryEntry("IIS://localhost/W3SVC");
  foreach (DirectoryEntry getentity in getdir.Children)
  {
    if (getentity.SchemaClassName.Equals("IIsWebServer"))
    {
         //設(shè)置應(yīng)用程序程序池 先獲得應(yīng)用程序 在設(shè)定應(yīng)用程序程序池
         //第一次測試根目錄
        foreach (DirectoryEntry getchild in getentity.Children)
        {
            if (getchild.SchemaClassName.Equals("IIsWebVirtualDir"))
            {
                //找到指定的虛擬目錄.
                foreach (DirectoryEntry getsite in getchild.Children)
                {
                    if (getsite.Name.Equals(appname))
                    {
                        //【測試成功通過】
                        getsite.Properties["AppPoolId"].Value = appname;
                        getsite.CommitChanges();
                    }
                }
            }
        }
    }
  }
}

思路如下:首先獲得ISS的根目錄即ISS://localhost/W3SVC,獲取成功后通過SchemaClassName獲取節(jié)點類型:ISSWebServer普通目錄、 ISSWebVirturalDir虛擬目錄,通過虛擬目錄的Name唯一名稱獲取指定虛擬目錄,在通過屬性參數(shù)AppPoolId設(shè)置附屬的應(yīng)用程序池的名稱,然后提交保存。

其實通過應(yīng)用我們可以清晰看到ISS中各個目錄之間的關(guān)聯(lián)關(guān)系,上面是修改一個已經(jīng)存儲在應(yīng)用程序池,如何創(chuàng)建:

public static bool CreateAppPool(string metabasePath, string appPoolName, string Username, string Password)
{
   bool issucess = false;
   try
   {
       if (metabasePath.EndsWith("/W3SVC/AppPools"))
       {
           if (MyIISHelper.AppPoolExist(appPoolName))
           {
              //已經(jīng)存在 先刪除這個AppPool 在創(chuàng)建
              //MessageBox.Show("當前以站點名稱命名的程序池已經(jīng)存在!");
              DeleteRepPool(appPoolName);
          }
       
              //創(chuàng)建一個新程序池
              DirectoryEntry newpool;
              DirectoryEntry apppools = new DirectoryEntry(metabasePath);
              newpool = apppools.Children.Add(appPoolName, "IIsApplicationPool");

              //設(shè)置屬性 訪問用戶名和密碼 一般采取默認方式
              newpool.Properties["WAMUserName"][0] = Username;
              newpool.Properties["WAMUserPass"][0] = Password;
              newpool.Properties["AppPoolIdentityType"][0] = "3";
              newpool.CommitChanges();
      }
      return issucess;
  }
  catch// (Exception ex)
  {
      return false;
  }
}

基本上和創(chuàng)建一個DirectoryEntity雷同,但注意指定的Schome類型是IIsApplicationPool,用來標識創(chuàng)建的是一個應(yīng)用程序池,當然創(chuàng)建可以刪除,刪除方式如下:

DirectoryEntry appPool = new DirectoryEntry("IIS://localhost/W3SVC/AppPools");
foreach (DirectoryEntry getdir in appPool.Children)
{
 if (getdir.Name.Equals(appname))
    {
      getdir.DeleteTree();//刪除
    }
}

關(guān)于應(yīng)用程序池如果不做任何設(shè)置,則在ISS中會被DefaultPool中添加,但有時默認程序池設(shè)置環(huán)境不一定能夠滿足當前程序需求,例如最常見的關(guān)于.NET版本的控制,其中對3.0和3.5版本應(yīng)用設(shè)置需要重新注冊3.5 .NET FrameWork部分組件,這就涉及到一個.NET版本問題。

<6>.NET版本問題

在進行ISS控制中當然也是遇到各種各樣的問題,一方面因為測試XP 2003系統(tǒng)環(huán)境不同,需要控制因素過多,當然其中值得一提就是關(guān)于整個應(yīng)用程序池的.NET版本問題,我們先來看看多版本下ISS中設(shè)置:

如果我們的應(yīng)用程序使用3.0或3.5版本,則在應(yīng)用程序池的沒有對應(yīng)的.NET版本,這時應(yīng)用程序運行會提示一個Http錯誤404.17 not Found:

其實ISS在處理應(yīng)用程序池于.NET版本進行映射時,Net3.0\3.5沒帶處理程序aspnet_isapi.dll,所以IIS中指定網(wǎng)站適用框架時,這也是為什么我們在ISS映射時看不到.Net3.0\3.5版本,最直接的方法重新注冊.NET 3.5 由.NET 2.0版本托管,這時我們需要執(zhí)行一個Cmd命令:

從新把應(yīng)用程序池.net版本切換成.net 2.0,同樣實現(xiàn).net 3.0/3.5托管。

<7>使用環(huán)境以及測試條件

如上應(yīng)用程序和代碼均在Windows 7./XP2/Windows Server 2003上通過,對應(yīng)的ISS版本范圍從ISS5.0/5.1到Iss 6.0/7.0,包含ISS7.0。篇幅有限,實際中關(guān)于ISS的操作還有很多細節(jié)問題不能面面俱到,我只是挑了其中我認為基礎(chǔ)或幾位重要幾個問題著重來寫,實際中關(guān)于ISS還有其他諸多因素,所以對于這方面控制編程只能折中的有目的性選擇自己想做的效果,切不可貪大求全,因為這本身控制過程就是復雜的過程,客戶環(huán)境也不能諸如統(tǒng)一,如有疑問請在留言中回復我。


該文章在 2018/9/8 17:22:23 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved