欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

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

C#操作IIS完整解析

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

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

A:版本問(wèn)題

這是你在進(jìn)行編程前必須要要考慮的一個(gè)實(shí)際問(wèn)題,因?yàn)镮IS版本不同對(duì)應(yīng)編程上基本上完全不同方式來(lái)進(jìn)行的,先了解一下Iss版本在操作系統(tǒng)個(gè)具體要求:

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

B:我們要做什么

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

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

C:進(jìn)入編程

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

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

<1>ISS版本的獲取

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

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

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

public static string GetIssVersion()
{
  //RegistryKey表示 Windows 注冊(cè)表中的項(xiàng)級(jí)節(jié)點(diǎn).此類是注冊(cè)表封裝
  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)建虛擬目錄

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

新建虛擬目錄:

/// <summary>
 /// 添加一個(gè)虛擬目錄
 /// </summary>
 public void CreateVirtualDir(string virtualdirname, string logicDir)
 {
     //如果存在重復(fù) 就直接刪除虛擬目錄
     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è)置起始默認(rèn)頁(yè):
    newVirDir.Properties["EnableDefaultDoc"][0] = true;
    newVirDir.Properties["DefaultDoc"][0] = "Default.aspx";

    //_newVirDir
    newVirDir.CommitChanges();
}

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

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

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

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

例如修改程序起始頁(yè):

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

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

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

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

我們能看到ISS服務(wù)命名是:ISSAdmin 我們通過(guò)編碼來(lái)控制:?jiǎn)?dòng)ISS。

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

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

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

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

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

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

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

/// <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)用程序程序池
         //第一次測(cè)試根目錄
        foreach (DirectoryEntry getchild in getentity.Children)
        {
            if (getchild.SchemaClassName.Equals("IIsWebVirtualDir"))
            {
                //找到指定的虛擬目錄.
                foreach (DirectoryEntry getsite in getchild.Children)
                {
                    if (getsite.Name.Equals(appname))
                    {
                        //【測(cè)試成功通過(guò)】
                        getsite.Properties["AppPoolId"].Value = appname;
                        getsite.CommitChanges();
                    }
                }
            }
        }
    }
  }
}

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

其實(shí)通過(guò)應(yīng)用我們可以清晰看到ISS中各個(gè)目錄之間的關(guān)聯(lián)關(guān)系,上面是修改一個(gè)已經(jīng)存儲(chǔ)在應(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)存在 先刪除這個(gè)AppPool 在創(chuàng)建
              //MessageBox.Show("當(dāng)前以站點(diǎn)名稱命名的程序池已經(jīng)存在!");
              DeleteRepPool(appPoolName);
          }
       
              //創(chuàng)建一個(gè)新程序池
              DirectoryEntry newpool;
              DirectoryEntry apppools = new DirectoryEntry(metabasePath);
              newpool = apppools.Children.Add(appPoolName, "IIsApplicationPool");

              //設(shè)置屬性 訪問(wèn)用戶名和密碼 一般采取默認(rèn)方式
              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)建一個(gè)DirectoryEntity雷同,但注意指定的Schome類型是IIsApplicationPool,用來(lái)標(biāo)識(shí)創(chuàng)建的是一個(gè)應(yīng)用程序池,當(dā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中會(huì)被DefaultPool中添加,但有時(shí)默認(rèn)程序池設(shè)置環(huán)境不一定能夠滿足當(dāng)前程序需求,例如最常見的關(guān)于.NET版本的控制,其中對(duì)3.0和3.5版本應(yīng)用設(shè)置需要重新注冊(cè)3.5 .NET FrameWork部分組件,這就涉及到一個(gè).NET版本問(wèn)題。

<6>.NET版本問(wèn)題

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

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

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

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

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

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


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