dotnet2.0的部署

Asp.net2.0中有两种编译方式:

1传统方式: 

      优点:
             1、使用简单,不需要任何操作,asp.net会自动编译。
             2、修改简单,自动进行监视并进行编译。
             3、调试简单,修改代码后刷新就能看到结果。
      缺点:
             1、不安全:对于不希望公开程序的人来说不适合。
             2、部署麻烦:需要复制大量的文件,包括源文件。
             3、第一次访问慢:因为在第一次访问页面的时候进行编译。
。net2.0文件在C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files下可以看到你的项目的名字的文件夹,打开你可以看到动态编译过的dll 以及扩展名为compiled的文件,compiled文件以xml的形式记录了页面和程序集之间的对应。

这样的结果是开发简单,部署麻烦,改善的方式有两种:

1安装vs2005sp1补丁可以回到以前的1.1的方式

2进行预编译(整站预编译)又分为原地预编译和部署预编译,以后维护的时候我可以采用ftp或者是http上传的方式不需要自己动手做文件复制工作。还没有第一次访问预编译导致速度慢的困扰,不需要删除源代码,系统已经自动删除,在部署的时候系统会自己在网站下创建一个app_offline.htm文件,这样访问网站的用户都看到“当前网站不可用”这样的友好提示。
在发布时候采用默认方式,勾选“允许更新此预编译站点”,并且不勾选“使用固定命名和单页程序集”,程序集的命名是随机的每次预编译发布都会不同。,使用这种方式发布网站,就只能更新整个站点,因此也叫整站预编译,另外两种选项,

1允许更新此预编译站点:使用这种选项,所有的aspx页面文件中不会出现任何html标签,所有内容都编译进入dll中,bin目录又多了一个xml格式的compiled 文件来指示页面文件和后台代码在编译后存在于哪个程序集中。但是页面文件却不能被删除。

2使用固定命名和单页程序集:使用这种选项,一个页面将会对应一个dll。

预编译方式的优缺点:

1安全 你的网站不可更新,即使是html代码和控件标记也看不到。

2方便:编译后没有任何源代码。

3还可以使用命令行(aspnet_compiler)来预编译,这样就可以实现每日编译或者定时编译。

缺点:部署的时候需要更新整个网站,比较慢。

不能单独编译一个文件,只能预编译站点所有文件。

 httpContent(请求上下文)

http处理程序是响应对asp.net web应用程序的请求而运行的程序.我们在开发中最常见的处理程序就是.aspx文件的asp.net页面处理程序.而在asp.net中还包含了处理处理.asmx的web服务处理程序,用于所有asp.net用户控件的默认http处理.ascx.

httpcontent 添加了一个profile对象,是2.0中添加的新对象,他获取的是在当前用户配置文件中配置的profileBase对象.

在asp.net中提供了两种方式去创建一个自定义的http处理程序,:创建一个实现httpHandler接口的类,用来创建同步处理程序,或者创建一个可实现IHttpAsyncHandler的类,用来创建异步处理程序,不管是哪种借口都要求实现IsReusable属性和ProcessRequest方法.IsReusable属性指定IHttpHandlerFactory对象是否可以将你的处理程序放置在池中,并且重新使用他们提高程序的性能,或是否在每次请求时创建新实例.

步骤1:在IIs中添加扩展名的处理

2实现IHttpHandler的类

3防盗链的效果

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Globalization;
using System.IO;

namespace HandlerAndModule
{
    
public class ImageHandler:IHttpHandler
    {
        
#region IHttpHandler 成员

        
public bool IsReusable
        {
            
get { return true; }
        }

        
public void ProcessRequest(System.Web.HttpContext context)
        {
            
//获取当前Request对象
            HttpRequest req = context.Request;
            
//从Request对象中获取所请求文件的物理路径
            string IMG_Path = req.PhysicalPath;
            
string ContentType;

            
//判断请求的URL是否为本站内的URL
            if (req.UrlReferrer != null && req.UrlReferrer.Host.Length > 0)
            {
                
if (CultureInfo.InvariantCulture.CompareInfo.Compare(req.Url.Host, req.UrlReferrer.Host, CompareOptions.IgnoreCase) != 0)
                {
                    IMG_Path 
= context.Server.MapPath("~/images/error.gif");
                }
            }

            
//根据路径名获取输出内容类型
            ContentType = GetContentType(IMG_Path);

            
//判断文件是否存在
            if (File.Exists(IMG_Path))
            {
                context.Response.StatusCode 
= 200;
                context.Response.ContentType 
= ContentType;
                context.Response.WriteFile(IMG_Path);
            }
            
else
            {
                context.Response.StatusCode 
= 404;
                context.Response.Status 
= "无法找到您请求的文件";
            }
        }

        
#endregion

        
/// <summary>
        
/// 此方法用于从路径获取输出的MIME类型
        
/// </summary>
        
/// <param name="path">文件路径</param>
        
/// <returns>对应的MIME类型</returns>
        private string GetContentType(string path)
        {
            
//获取文件的扩展名
            string extension = Path.GetExtension(path);
            
string contentType;
            
//判断扩展名对应的Mime类型
            switch (extension)
            {
                
case ".gif":
                    contentType 
= "image/gif";
                    
break;
                
case "image/jpeg":
                    contentType 
= "image/jpeg";
                    
break;
                
case ".png":
                    contentType 
= "image/png";
                    
break;
                
default:
                    contentType 
= "";
                    
break;
            }
            
//返回mime类型
            return contentType;
        }
    }
}

4还需要在web.config中配置处理程序,以便能处理IIS中的请求.通过在应用程序中创建一个<httpHandlers>节点,即可注册HTTP处理程序,下面就是与我们这个程序相关的一些Http处理程序的配置信息:

<httpHandlers>
   <add verb="*" path="*.jpg"
                   type="HandlerAndModule.ImageHandler, HandlerAndModule "/>
   <add verb="*" path="*.gif"
      type="HandlerAndModule.ImageHandler, HandlerAndModule "/>
   <add verb="*" path="*.png"
      type="HandlerAndModule.ImageHandler, HandlerAndModule "/>
  </httpHandlers>

 verb可以是Get或者是Post,表示对Get或者是Post的请求进行处理.在Type属性中,逗号前的字符串是HttpHanddler的实现类的类名,后面的字符串就是处理程序的文件名.

假如你从网站的<img >标签中访问该图片,则将会出现图片无法访问的错误图片信息.

IHttpHandlerFactory接口用于创建和管理处理请求的HTTP处理程序.

 

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace HandlerFactory
{
    
public class RARHandler:IHttpHandler,System.Web.SessionState.IRequiresSessionState
    {
        
#region IHttpHandler 成员

        
public bool IsReusable
        {
            
get { return true; }
        }

        
public void ProcessRequest(HttpContext context)
        {
            HttpRequest req 
= context.Request;
            
//从Request对象中获取所请求文件的物理路径
            string RAR_Path = req.PhysicalPath;
            
//设置HTTP输出的MIME类型
            string ContentType = "application/x-tar";
            
//根据Session中UserName是否存在判断用户是否登陆
            if (context.Session["UserName"== null)
            {
                
//未登陆则设置状态代码为404
                context.Response.StatusCode = 404;
                context.Response.End();
            }
            
else
            {
                
//登陆则输出RAR文件
                context.Response.StatusCode = 200;
                context.Response.ContentType 
= ContentType;
                context.Response.WriteFile(RAR_Path);
            }
        }

        
#endregion
    }
}

 

 

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace HandlerFactory
{
    
public class MyHandlerFactory:IHttpHandlerFactory
    {
        
#region IHttpHandlerFactory 成员

        IHttpHandler IHttpHandlerFactory.GetHandler(HttpContext context, 
string requestType, string url, string pathTranslated)
        {
            
//判断文件扩展名
            if (url.EndsWith(".jpeg", StringComparison.InvariantCultureIgnoreCase) || url.EndsWith(".jpg", StringComparison.InvariantCultureIgnoreCase))
                
//实例化并返回一个JPGHandler
                return new JPGHandler();
            
else if (url.EndsWith(".rar", StringComparison.InvariantCultureIgnoreCase))
                
//实例化并返回一个RARHandler
                return new RARHandler();
            
else
                
return null;
        }

        
void IHttpHandlerFactory.ReleaseHandler(IHttpHandler handler)
        {
        }

        
#endregion
    }
}

 

web.config中


<httpHandlers>
            
<add path="image/*.*" verb="*" type="HandlerFactory.MyHandlerFactory,HandlerFactory"/>
        
</httpHandlers>

 

第三: HttpModule,httpModule和Http处理程序不同,Http模块是一个在每次针对应用程序发出请求时调用的程序集,而Http处理程序则是用于处理客户端的请求.HttpModule作为Http请求管线的一部分调用,他们能够在整个请求过程中访问生命周期事件.Asp.net HttpModule是针对所有请求进行的.而Http处理程序则是针对某个或者某些特殊的请求进行处理的.HttpModule的功能十分强大,应用也十分广泛,比较常用的有Forms身份验证,缓存和会话管理等.

当客户端浏览器发起的请求到达IIs后,经过HTTP RunTime处理,创建生成请求的上下文对象,然后再将请求交由HttpModule来处理,经过一个或者多个HttpModule处理后,才会交由请求处理器程序,例如HttpHandler,*.aspx或者是*.asmx等去处理.

我们可以实现IHttpModule接口的类来创建Http模块处理程序,在web.config中注册.运行生成实例,调用Init方法,执行应用程序事件BeginRequest和EndRequest等.

 

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Collections;
using System.Collections.Specialized;

namespace HandlerAndModule
{
    
public class IPModule:IHttpModule
    {
        
#region IHttpModule 成员

        
public void Dispose()
        {
        }

        
public void Init(HttpApplication context)
        {
            context.BeginRequest 
+= new EventHandler(OnBeginRequest);
        }

        
#endregion

        
private void OnBeginRequest(object sender, EventArgs e)
        {
            HttpApplication app 
= sender as HttpApplication;
            
if (app != null)
            {
                
if(isBadIPAddr(app.Context))
                {
                    app.Context.Response.StatusCode 
= 404;
                    app.Context.Response.End();
                }
            }
        }

        
private bool isBadIPAddr(HttpContext context)
        {
            
string ip = context.Request.UserHostAddress;
            StringDictionary sdic 
= new StringDictionary();
            sdic.Add(
"127.0.0.0""127.0.0.0");
            
if (sdic.ContainsKey(ip))
                
return true;
            
else
                
return false;
        }
    }
}

相应的web.config

<httpModules>
            
<add name="IPModule" type="HandlerAndModule.IPModule, HandlerAndModule"/>          
        
</httpModules>

name表示我们这个Http模块名,type是以逗号隔开的字符串,前面部分是IHttpModule的实现类的类名,逗号后面部分是程序集的文件名.

 

 .NET Framework 是支持生成和运行下一代应用程序和 XML Web services 的内部 Windows 组件。.NET Framework 旨在实现下列目标:   提供一个一致的面向对象的编程环境,而无论对象代码是在本地存储和执行,还是在本地执行但在 Internet 上分布,或者是在远程执行的。   提供一个将软件部署和版本控制冲突最小化的代码执行环境。   提供一个可提高代码(包括由未知的或不完全受信任的第三方创建的代码)执行安全性的代码执行环境。   提供一个可消除脚本环境或解释环境的性能问题的代码执行环境。   使开发人员的经验在面对类型大不相同的应用程序(如基于 Windows 的应用程序和基于 Web 的应用程序)时保持一致。   按照工业标准生成所有通信,以确保基于 .NET Framework 的代码可与任何其他代码集成。   .NET Framework 具有两个主要组件:公共语言运行库和 .NET Framework 类库。公共语言运行库是 .NET Framework 的基础。您可以将运行库看作一个在执行时管理代码的代理,它提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。事实上,代码管理的概念是运行库的基本原则。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。.NET Framework 的另一个主要组件是类库,它是一个综合性的面向对象的可重用类型集合,您可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面 (GUI) 应用程序,也包括基于 ASP.NET 所提供的最新创新的应用程序(如 Web 窗体和 XML Web services)。   .NET Framework 可由非托管组件承载,这些组件将公共语言运行库加载到它们的进程中并启动托管代码的执行,从而创建一个可以同时利用托管和非托管功能的软件环境。.NET Framework 不但提供若干个运行库宿主,而且还支持第三方运行库宿主的开发。   .NET Framework是Microsoft为开发应用程序而创建的一个富有革命性的新平台。   这句话最有趣的地方是它的含糊不清,但这是有原因的。首先,注意这句话没有说“在Windows操作系统上开发应用程序”。尽管.NET Framework的Microsoft版本运行在Windows操作系统上,但以后将推出运行在其他操作系统上的版本,例如Mono,它是.NET Framework的开发源代码版本(包含一个C#编译器),该版本可以运行在几个操作系统上,包括各种Linux版本和Mac OS。许多这类项目正在开发,在读者阅读本书时可能就已发布了。另外,还可以在个人数字助手(PDA)类设备和一些智能电话上使用Microsoft .NET Compact Framework(基本上是完整 .NET Framework的一个子集)。使用.NET Framework的一个主要原因是它可以作为集成各种操作系统的方式。   另外,上面给出的.NET Framework定义并没有限制应用程序的类型。这是因为本来就没有限制。.NET Framework可以创建Windows应用程序、Web应用程序、Web服务和其他各种类型的应用程序。   .NET Framework的设计方式保证它可以用于各种语言,包括本书要介绍的C#语言,以及C++、Visual Basic、JScript,甚至一些旧的语言,如COBOL。为此,还推出了这些语言的.NET版本,目前还在不断推出更多的.NET版本的语言。所有这些语言都可以访问.NET Framework,它们还可以彼此交互。C#开发人员可以使用Visual Basic程序员编写的代码,反之亦然。   所有这些提供了意想不到的多样性,这也是.NET Framework具有诱人前景的部分原因。.NET Framework的内容   .NET Framework主要包含一个非常大的代码库,可以在客户语言(如C#)中通过面向对象编程技术(OOP)来使用这些代码。这个库分为不同的模块,这样就可以根据希望得到的结果来选择使用其中的各个部分。例如,一个模块包含Windows应用程序的构件,另一个模块包含联网的代码块,还有一个模块包含Web开发的代码块。一些模块还分为更具体的子模块,例如在Web开发模块中,有用于建立Web服务的子模块。   其目的是,不同的操作系统可以根据自己的特性,支持其中的部分或全部模块。例如,PDA支持所有的核心.NET功能,但不需要某些更深奥的模块。   部分.NET Framework库定义了一些基本类型。类型是数据的一种表达方式,指定其中最基础的部分(例如32位带符号的整数),以便使用.NET Framework在各种语言之间进行交互操作。这称为通用类型系统(Common Type System,CTS)。   除了支持这个库以外,.NET Framework还包含.NET公共语言运行库(Common Language Runtime,CLR),它负责管理用.NET库开发的所有应用程序的执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值