ASP.NET 管理网站(虚拟目录)

news/2024/5/14 14:06:18/文章来源:https://blog.csdn.net/yanzhibo/article/details/18233863

部署了网站之后,就可以通过 IIS 的功能来管理网站宿主和执行的方式。

 

创建新站点

       IIS 7 能够在单台服务器上支持多个站点。要创建新站点,展开 IIS 管理器的树控件,右击“网站”,选择“添加网站”,会显示如下对话框:

       image

       网站名称中可以填写有意义的内容,不过,它只用于在 IIS 里标识网站,但并不影响网站的内容。物理路径指定了 IIS 7 到哪里寻找服务新网站请求的内容。我们创建了一个新目录 C:\FileCopySite。“连接为”和“测试设置”按钮可以指定用于访问网站内容的不同用户身份。

       “绑定”一节可以指定 IIS 7 如何监听来自客户端的请求。IIS 7 支持一系列的网络协议,“类型”下拉列表有众多选项,但我们只关注 HTTP,因为它是最广泛被使用的。IP 地址我们采用默认的“全部未分配”,也就是说 IIS 监听处理其他网站在同一 TCP 端口上已经被服务的网络接口之外的全部网络接口。“端口”值指定 IIS 7 要监听客户端请求的 TCP 端口号,一般而言每个网站必须仅由唯一的端口提供服务,因此我们选择了 81,这样不会和默认网站的 80 端口相冲突。

       勾选了“立即启动网站”,它表示在我们单击“确定”之后,IIS 就创建网站并开始监听请求。现在单击确定。

 

创建虚拟目录

       在之前的部署网站系列文章里,我们把内容放到了 IIS 7 寻找内容的默认目录里。但我们也可以不这样做,而是把内容放到其他地方,然后通过虚拟目录来引用它。为了演示,我们在服务器上创建一个新目录,并把网站的内容复制到了那里,新目录路径如下:

C:\WebSiteDeployment\VirtualDirectory

       为了把新目录关联到 IIS ,右击“默认网站”,选择“添加虚拟目录”,会打开如下对话框:

       image

       我们希望网站的 URL 是这样的:/virtual">/virtual">/virtual">http://<servername>/virtual,因此在别名里输入了 virtual。单击“确定”创建虚拟目录。为了测试它,浏览器现在访问 URLhttp://localhost/virtual,你会看到自己的简单网站,但这一回内容是以新目录作为源的,并且通过自定义的 URL 来进行访问。

       甚至可以有多个虚拟目录指向一个实际物理路径,访问同一资源时,显示的 URL 是不同的。

imageimage

 

      

使用 VirtualPathProvider

       VirtualPathProvider 类提供了虚拟目录之外的另一个选择,不再由文件系统提供网站内容,内容可以通过编程生成或者取自数据库。

       下面我将通过一个从 SQL Server 表读取 ASPX 文件的简单示例来理解 VirtualPathProvider 类。我们在本地 SQL Server 上有一个如下图所示的数据库表,里面保存了 3 个页面:

       image

       你可以看到表里有一个文件名(同时还是主键)和真是内容。内容可以是 ASP.NET 能够理解的任意类型的代码。

 

      

       VirtualPathProvider 类被定义在 System.Web.Hosting 命名空间里。在 App_Code 目录里新增一个类并继承 VirtualPathProvider,至少要实现以下方法:

using System;
using System.Data.SqlClient;
using System.IO;
using System.Text;
using System.Web.Hosting;
 
// VirtualPathProvider: 使 Web 应用程序可以从虚拟文件系统中检索资源
public class DBPathProvider : VirtualPathProvider
{
    public static void AppInitialize()
    {
        // HostingEnvironment: 在托管应用程序的应用程序域内向托管应用程
        // 序提供应用程序管理功能和应用程序服务
        // RegisterVirtualPathProvider(): 在 ASP.NET 编译系统中注册新
        // 的 VirtualPathProvider 实例
        HostingEnvironment.RegisterVirtualPathProvider(new DBPathProvider());
    }
 
    // VirtualPathProvider.FileExists(): 获取一个值,该值指示文件是否
    // 存在于虚拟文件系统中
    public override bool FileExists(string virtualPath)
    {
        throw new Exception("The method or operation is not implemented.");
    }
 
    // VirtualPathProvider.GetFile(): 从虚拟文件系统中获取一个虚拟文件
    public override VirtualFile GetFile(string virtualPath)
    {
        throw new Exception("The method or operation is not implemented.");
    }
}

       提供程序必须实现一个静态的 AppInitialize 方法,这个方法应创建自定义类的实例并把它注册为 Framework 的提供程序;FileExists 方法用于检查某个路径是否可以由提供程序提供;GetFile 方法用于获取某个路径的内容,返回抽象类 VirtualFile 的实例。

 

       Framework 没有提供 VirtualFile 类的具体实现,我们必须自己扩展 VirtualFile 类来支持自己的提供程序。下面是我们的提供程序的 VirtualFile 类的实现,它被放在同一个代码文件中:

public class DBVirtualFile : VirtualFile
{
    private string _FileContent;
 
    public DBVirtualFile(string virtualPath, string fileContent)
        : base(virtualPath)
    {
        _FileContent = fileContent;
    }
 
    public override Stream Open()
    {
        Stream stream = new MemoryStream();
        StreamWriter write = new StreamWriter(stream,Encoding.Unicode);
        write.Write(_FileContent);
        write.Flush();
        stream.Seek(0, SeekOrigin.Begin);
        return stream;
    }
}

       这个类的构造函数获取虚拟路径以及文件的内容。在 Open 方法里,真实内容的字符串被保存到了 MemoryStream,然后返回这个流。ASP.NET 使用这个流读取内容,就好像它在读取文件系统一样(感谢基于 Stream 类的字节抽象)。

 

       下一步是继续完成 VirtualPathProvider 类。它需要读取来自数据库文件的真实数据。如果文件在数据库里不存在,提供程序就把请求转送给它的前一个提供程序(由框架在静态方法 AppInitialize 里注册时选定)。给 DBPathProvider 类增加一个从数据库获取内容的方法

private string GetFileFromDB(string virtualPath)
{
    string contents;
    string fileName = virtualPath.Substring(virtualPath.IndexOf('/', 1), +1);
 
    // Read the file from the database.
    SqlConnection conn = new SqlConnection();
    conn.ConnectionString = @"Data Source=.\SqlExpress;Initial Catalog=AspNetContents;
        Integrated Security=true";
    conn.Open();
 
    try
    {
        SqlCommand cmd = new SqlCommand("select FileContents from AspContent "
            + "where FileName=@fn", conn);
        cmd.Parameters.AddWithValue("@fn", fileName);
        contents = cmd.ExecuteScalar() as string;
        if (contents == null)
        {
            contents = string.Empty;
        }
    }
    catch
    {
        contents = string.Empty;
    }
    finally
    {
        conn.Close();
    }
    return contents;
}

 

       GetFileFromDB 函数从虚拟路径获取文件名并从数据库读取该文件名对应的内容。此方法将同时被 FileExists() 和 GetFile() 使用

// VirtualPathProvider.FileExists(): 获取一个值,该值指示文件是否
// 存在于虚拟文件系统中
public override bool FileExists(string virtualPath)
{
    string contents = this.GetFileFromDB(virtualPath);
    if (contents.Equals(string.Empty))
    {
        return false;
    }
    else
    {
        return true;
    }
}
 
// VirtualPathProvider.GetFile(): 从虚拟文件系统中获取一个虚拟文件
public override VirtualFile GetFile(string virtualPath)
{
    string contents = this.GetFileFromDB(virtualPath);
    if (contents.Equals(string.Empty))
    {
        // VirtualPathProvider.Previous: 获取对编译系统中以前注册的 
        // System.Web.Hosting.VirtualPathProvider 对象的引用
        return Previous.GetFile(virtualPath);
    }
    else
    {
        return new DBVirtualFile(virtualPath, contents);
    }
}

       你还可以在自己的提供程序里实现一些额外的方法,它们对更复杂的模型会很有用。比如,验证目录是否存在(DirectoryExists)、计算文件散列值(GetFileHash),以及执行缓存验证(GetCacheDependency)等等

 

       现在输入以下3个请求URL可以看见数据库中这 3 个简单网页的效果:

       image

       现在你不使用网站的文件系统,也可也动态的生成网页了,将网站部署到服务器即可。

 

       示例完整代码如下:

using System;
using System.Data.SqlClient;
using System.IO;
using System.Text;
using System.Web.Hosting;
 
// VirtualPathProvider: 使 Web 应用程序可以从虚拟文件系统中检索资源
public class DBPathProvider : VirtualPathProvider
{
    public static void AppInitialize()
    {
        // HostingEnvironment: 在托管应用程序的应用程序域内向托管应用程
        // 序提供应用程序管理功能和应用程序服务
        // RegisterVirtualPathProvider(): 在 ASP.NET 编译系统中注册新
        // 的 VirtualPathProvider 实例
        HostingEnvironment.RegisterVirtualPathProvider(new DBPathProvider());
    }
 
    // VirtualPathProvider.FileExists(): 获取一个值,该值指示文件是否
    // 存在于虚拟文件系统中
    public override bool FileExists(string virtualPath)
    {
        string contents = this.GetFileFromDB(virtualPath);
        if (contents.Equals(string.Empty))
        {
            return false;
        }
        else
        {
            return true;
        }
    }
 
    // VirtualPathProvider.GetFile(): 从虚拟文件系统中获取一个虚拟文件
    public override VirtualFile GetFile(string virtualPath)
    {
        string contents = this.GetFileFromDB(virtualPath);
        if (contents.Equals(string.Empty))
        {
            // VirtualPathProvider.Previous: 获取对编译系统中以前注册的 
            // System.Web.Hosting.VirtualPathProvider 对象的引用
            return Previous.GetFile(virtualPath);
        }
        else
        {
            return new DBVirtualFile(virtualPath, contents);
        }
    }
 
    private string GetFileFromDB(string virtualPath)
    {
        string contents;
        string fileName = virtualPath.Substring(virtualPath.IndexOf('/', 1) + 1);
 
        // Read the file from the database.
        SqlConnection conn = new SqlConnection();
        conn.ConnectionString = @"Data Source=.\SqlExpress;Initial Catalog=AspNetContents;
            Integrated Security=true";
        conn.Open();
        try
        {
            SqlCommand cmd = new SqlCommand("select FileContents from AspContent "
                + "where FileName=@fn", conn);
            cmd.Parameters.AddWithValue("@fn", fileName);
            contents = cmd.ExecuteScalar() as string;
            if (contents == null)
            {
                contents = string.Empty;
            }
        }
        catch
        {
            contents = string.Empty;
        }
        finally
        {
            conn.Close();
        }
        return contents;
    }
}
 
public class DBVirtualFile : VirtualFile
{
    private string _FileContent;
 
    public DBVirtualFile(string virtualPath, string fileContent)
        : base(virtualPath)
    {
        _FileContent = fileContent;
    }
 
    public override Stream Open()
    {
        Stream stream = new MemoryStream();
        StreamWriter write = new StreamWriter(stream, Encoding.Unicode);
        write.Write(_FileContent);
        write.Flush();
        stream.Seek(0, SeekOrigin.Begin);
        return stream;
    }
}

       总结一下整篇代码的工作顺序与原理。

  1. AppInitialize() 被 Framework 调用。我们向 ASP.NET 编译系统注册了自定义的 DBPathProvider 类,使得这个 Web 应用程序可以从虚拟文件系统中检索资源。
  2. FileExists(string virtualPath) 被调用。它告诉系统是否存在请求路径,如果存在,则通知程序继续查找内容(事件激发系统继续调用 GetFile 方法)
  3. GetFile(string virtualPath) 被调用。如果获取不到文件内容,则将请求交由编译系统以前注册的提供程序处理(回复到 ASP.NET 网页请求的默认处理流程)。如果成功获取数据库中对应文件名的网页内容,则创建 VirtualFile 类的实例(我们的扩展类 DBVirtualFile 实现了它),同时传入路径和网页内容至 DBVirtualFile 的构造函数
  4. Open() 被调用。它将字符串表现形式的网页内容读取到内存流中并返回这个流。
  5. ASP.NET 使用这个流读取内容,就好像它在读取文件一样!

       上述方法的调用均由 .NET 内部事件机制做驱动,并无显式的调用逻辑和顺序。

 

原文:http://www.cnblogs.com/SkySoot/archive/2013/04/02/2995533.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_852102.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iis配置多个网站,iis绑定多个域名

iis配置多个网站,iis绑定多个域名?这个问题,现在大多数不会整VPS的朋友,都会去帮手来解决,其实,没有必要拉,小伙伴;下面我来分享一个简单的操作; 如图示&#xff1a; 可以看到&#xff0c;上面挂了两个网站&#xff0c;并且端口都是80&#xff0c;那么这个功能是如何实现的呢&…

网站重构的8点建议

1.用局部变量替换多次使用的对象 比如我们在一段代码内&#xff0c;多次使用document、window这样的对象&#xff0c;我们可以用局部变量替换他们。 var d document,w window; 原理&#xff1a;访问直接量和局部变量的速度快&#xff0c;相反&#xff0c;访问数组元素和对…

大气 html5 企业网站,高端大气HTML5科技企业网站响应式网站带后端

页面简洁简单&#xff0c;容易管理&#xff0c;DEDE内核都能使消耗&#xff1b;附带测试数据&#xff01;模板主要适消耗于&#xff0c;企业网站展现网站等。模板特点&#xff1a;1&#xff0c;模板包括首页、列表页、企业简介、以及内容页等页面&#xff0c;代码书写规范&…

浅谈Web网站架构演变过程

原文地址&#xff1a;http://www.codeceo.com/article/web-artche-changes.html#0-tsina-1-84073-397232819ff9a47a7b7e80a40613cfe1 前言 我们以javaweb为例&#xff0c;来搭建一个简单的电商系统&#xff0c;看看这个系统可以如何一步步演变。 该系统具备的功能&#xff1a; …

网站架构系列:消息队列

原文地址&#xff1a;http://www.codeceo.com/article/web-archte-message-queue.html#0-tsina-1-26189-397232819ff9a47a7b7e80a40613cfe1 一、消息队列概述 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问…

让网站永久拥有HTTPS - 申请免费SSL证书并自动续期

本文永久地址为什么要用HTTPS相关简介 Let’s EncryptCertbot便宜SSL 获取HTTPS证书 命令行 安装Certbot申请证书 图形化 部署HTTPS证书设置HTTP强制跳转HTTPS命令行下设置证书自动续期附&#xff1a; 其它环境下的证书部署Nginx相关命令crontab相关命令 参考文档 本文永久地址…

分享10个超棒的设计素材网站

对于设计师来说&#xff0c;在工作中遇到的最糟糕的情况&#xff0c;莫过于灵感枯竭。而解决这个问题最好的方式&#xff0c;就是多逛设计素材网站。通过这种方式&#xff0c;不仅可以欣赏其他设计师们的作品&#xff0c;让自己脑洞大开&#xff0c;而且还能收获丰富的资源&…

【首篇】我想谈谈大型网站架构

如果能够学到架构理论&#xff0c;是一件很幸福的事&#xff0c;而要是能够从0到1搭建一个完整的大型网站&#xff0c;并且&#xff0c;将其投入到生活当中&#xff0c;还能被大多数人所使用&#xff0c;则是一件很幸运的事了。 这系列博客不谈业务&#xff0c;只谈技术&#…

SEO网站标题优化

【阅读文章申明】 作者只是想把自己实践中的经验分享给大家&#xff0c;如果文章里面有在大神面前显的很低级的知识点。那么大神你可以不看&#xff0c;请不要发一些“浪费流量”“辣鸡”之类嘲讽的话&#xff0c;这也不是交流的一种方式。每一篇文章都是作者自己。截图&#x…

linux 内核位置无关,常用的设备无关启动时参数 - Linux操作系统内核启动参数详解_Linux教程_Linux公社-Linux系统门户网站...

常用的设备无关启动时参数。1、init&#xff1d;...设置内核执行的初始化进程名&#xff0c;如果该项没有设置&#xff0c;内核会按顺序尝试/etc/init&#xff0c;/bin/init&#xff0c;/sbin/init&#xff0c; /bin/sh&#xff0c;如果所有的都没找到&#xff0c;内核会抛出 k…

浏览器网站打印标签

网站通过浏览器来打印标签 文章目录网站通过浏览器来打印标签一、标签需要条码&#xff1f;二、使用前的标签打印机的配置三、使用步骤1.引入maven包2.编写生成条码的工具类3.封装调用接口&#xff0c;生成条码&#xff0c;并跳转到标签打印页面。4.页面调用浏览器的打印工具5.…

10个很棒的学习Android 开发的网站

10个很棒的学习Android 开发的网站 看到江湖旅人 写的《10个很棒的学习iOS开发的网站 - 简书》&#xff0c;所以就忍不住写Android 啦&#xff0c;也希望对大家有帮助。 我推荐的网站&#xff0c;都是我在学习Android 开发过程中发现的好网站&#xff0c;给初学者一些建议&…

VS2012发布网站详细步骤

&#xfeff;&#xfeff;1、打开你的VS2012网站项目&#xff0c;右键点击项目》菜单中 重新生成一下网站项目&#xff1b;再次点击右键》发布&#xff1a; 1、打开你的VS2012网站项目&#xff0c;右键点击项目》菜单中 重新生成一下网站项目&#xff1b;再次点击右键》发布&am…

网站出现无法连接数据库错误,Temp文件夹权限对网站的影响

服务器上几个ASP Access的网站出现无法连接数据库的问题&#xff0c;数据库文件夹的权限没有问题&#xff0c;重启IIS&#xff0c;重启服务器&#xff0c;都不能解决。 最后解决方法是&#xff0c;修改Windows下Temp文件夹的user权限&#xff0c;因为数据库的读写会在系统中产…

ASP.NET:部署网站

IIS&#xff1a;信息服务器 必须在服务器上装上IIS&#xff0c;再把做的网页放在IIS上。 “这台配制够高的电脑装了IIS之后才叫做服务器” 部署ISS的流程&#xff1a; 1.打开控制面板&#xff0c;将查看方式改为大图标&#xff0c;点击“程序和功能”&#xff0c;点击“启用…

【CSS+DIV】(3)——网上购物网站

背景&#xff1a;CSS学习已经完成了&#xff0c;这部分内容比较好玩&#xff0c;后面还分析制作了各种小例子&#xff0c;UI的内容做的十分绚丽多彩&#xff0c;如果加上后台内容就会更加完美了。目前网络上的购物网站已经越来越多了&#xff0c;淘宝、京东、当当等大型购物网站…

HTML网站世界的多姿多彩---C#

前言&#xff1a;学习HTML的时候&#xff0c;感觉特别好玩&#xff0c;同时在这些点滴中也学会了非常多的知识。下面是总结的网站的知识点&#xff0c;和大家分享一下。 &#xff08;一&#xff09;入门 1.准备&#xff1a;HTML是通用语言&#xff08;只需要有浏览器和记事本…

服务器(6)--Nginx实现HTTPS网站设置

一、HTTPS 全称&#xff1a;Hyper Text Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;是以安全为目标的HTTP通道&#xff0c;简单讲是HTTP的安全版。即HTTP下加入SSL层&#xff0c;HTTPS的安全基础是SSL&#xff0c;因此加密的详细内容就需要SSL。 它是…

考试系统维护--网站发布注意事项

考试系统维护过程中做的最多的事情之一就是网站发布&#xff0c;从最初拿过来的旧的考试系统搭建发布&#xff0c;到自己修改后新的考试系统再次一次次发布测试&#xff0c;甚至还有各种备份服务器的发布&#xff0c;发布网站这件事情也就从最初的慢慢吞吞&#xff0c;磕磕绊绊…

小心错误使用EasyUI 让网站性能减半

小心错误使用EasyUI 让网站性能减半 背景&#xff1a; 最近接手了公司一个做了小一年的项目—高校教务基础系统&#xff0c;先不谈需求&#xff0c;和系统架构&#xff0c;直接上来就被抛来了一个问题----基础性能太差了&#xff0c;一个网页打开要好几秒。我了个天&#xff0c…