一、 写在前面:
由于工作比较紧张!代码写多了头脑就会发热,所以程序员一定要注意休息,不要太多的熬夜,俗语说得好:“什么都可以有就是不可以有病!”;
昨晚体验了一下 vs2005,真是不一样的感觉,不能不佩服M$的眼光和想象力。深远的影响到每一个程序员。无论是从界面体验、功能体贴、人性化、代码的简洁等哪方面考虑,他带给我们的是效率的提升,和把事情的简单化。简单就是最好的。
我们不需要再加班的梦想也许不会太远了 …
让我们一起来吧!
二、 原理:
好了!有时候我们总是喜欢说废话。但是有时候废话却很可以调节心情,那么就继续把:
asp.net显示位图的唯一方法(因为目前我只知道这么一个方法^_^)就是将ImagUrl的连接设到一个页面上,然后在那个叶面将位图Respone到叶面上就行了!不过就是麻烦点而已。就是这样:
src="region.binaryimage\fccc37ab-f4cb-4199-8332-7ff0168daad4.aspx"。
那么要把这样一种过程集成到组建里面去,就可以不用再为建一个目标叶面而浪费时间了,以方便又省事(因为我比较懒,所以我比较喜欢写一些组件以便满足我的惰性)。
经过周密的研究后 (^_^)得出一个解决方案:
组件自动产生一个相关目录,在该目录中再建个配置文件,以便把响应重定位到我们自定义类型处理。
三、 组件技术:
那么为了实现这个伟大的组件 (^_^),我们需要一些组件方面的技术。
1、也是最重要的一点就是叶面重定位技术,在配置文件节点
< configuration >
< system.web >
< httpHandlers >
< add verb ="" path ="" type ="Region.Controls.BinaryImageHandler, region.binaryimage"/>
重定位到我们自定义类型。
2、如何实现自定义类型。在.net framework 中提供一个接口来达到这个效果,我们的自定义类型 Region.Controls.BinaryImageHandler 必须继承自 System.Web.IhttpHandler实现他的两个接口。(由于篇幅的关系,更深入的原理就不在这里细说了,感兴趣的话可以查看MSDN)
3、还有一点就是位图的如何从源页传到目标页的呢?由于我们没有目标页,所有处理都在我们的自定义类型当中处理,而HttpHandler已发的时候Session等对象都还没有实力化,唯一可行的方法就是位图保存在Application里面。用完之后删掉就可以了。
4、那么还有几个地方要注意,就是将位图保存在Application中的ID,因为是全局的。所以可以取个GUID来稿定。
基本上就可以这么高定了!
源码发到下面,新建个类库项目将下面代码 Copy然后编译就可以了!:(因为不前我还没有空间提供下载,如果哪位好心朋友提供我可上传上去供大家方便下载)
#region [ BinaryImage Show Coponent]
/// Author:Region
/// MSN:hl_[email protected]
/// Blog:http://Blog.csdn.net/xinyulou
#endregion
using System;
using System.IO;
using System.Web;
using System.Resources;
using System.Reflection;
namespace Region.Controls
{
///
1<summary>
2
3/// 显示位图
4
5/// </summary>
///
1<code>
2
3/// ```
4@ Register TagPrefix="Region" Namespace="Region.Controls" Assembly="Region.Controls"
/// <region:binaryimage id="BinaryImage" runat="server"></region:binaryimage>
///
1//[System.Web.UI.ToolboxData("<{0}:BinaryImage runat=server>
2<!--{0}:BinaryImage-->
3")]
4
5public class BinaryImage:System.Web.UI.WebControls.Image
6
7{
8
9string path1 ;
10
11protected override void OnLoad(EventArgs e)
12
13{
14
15base .OnLoad (e);
16
17path1 = Path.Combine(Page.Request.PhysicalApplicationPath,Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().Location));
18
19string path2 = Path.Combine(path1,"Web.config");
20
21if (!Directory.Exists(path1))
22
23{
24
25Directory.CreateDirectory(path1);
26
27}
28
29if (!File.Exists(path2))
30
31{
32
33// ResourceManager rm = new ResourceManager(Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().Location)+".String", Assembly.GetExecutingAssembly());
34
35// string a = rm.GetString("Config");
36
37string a = "
38<?xml version=\"1.0\" encoding=\"utf-8\" ?>
39"+@"
<system.web>"+@"
"+"<add "+path.getfilenamewithoutextension(assembly.getexecutingassembly().location)+""="" .gettype().namespace+".binaryimagehandler,="" path='""' this="" type='""+' verb='""'>"+@"
"+@"
</system.web>"+@"
``` "+@"";
byte [] bs = System.Text.Encoding.Default.GetBytes(a);
FileStream fileStream = new FileStream(path2,FileMode.Create, FileAccess.Write);
try
{
fileStream.Write(bs, 0,bs.Length);
}
finally
{
if (fileStream != null )
{
((IDisposable)fileStream).Dispose();
}
}
}
}
//唯一ID
public string GUID
{
get
{
if ( ViewState[UniqueID]== null )
ViewState[UniqueID] = Guid.NewGuid().ToString();
return ( string )ViewState[UniqueID];
}
}
//[System.ComponentModel.Browsable(false)]
public byte [] Binary
{
set { Page.Session[GUID] = value ;}
get { return Page.Session[GUID]== null ? null :( byte [])Page.Session[GUID];}
}
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
if (ImageUrl == "")
{
ImageUrl = Path.Combine(Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().Location), GUID+".aspx");
if (Page.Application[GUID] == null )
Page.Application[GUID] = Binary;
}
base .Render(writer);
}
}
public class BinaryImageHandler:System.Web.IHttpHandler
{
public virtual bool IsReusable
{
get { return true ;}
}
public virtual void ProcessRequest(HttpContext context)
{
string id = Path.GetFileNameWithoutExtension(context.Request.FilePath);
if (context.Application[id] != null )
{
byte [] bs = ( byte [])context.Application[id];
HttpContext.Current.Response.BinaryWrite(bs);
context.Application[id] = null ;
}
}
}
四、 写在最后:
边听着悠扬美妙的音乐、边体验 Codes的诗一般的美。
如此而已
Share u opinion
如果你有什么想法,欢迎写下来!