用BeginGetResponse进行异步处理

2008-09-26

在今天做的小项目中
用户登录成功后要访问另一个应用的一个url,只是get过去。
首先想到用HttpWebRequest去直接GetResponse()就OK了
但这里会有一个问题:如果另一个应用的响应时间过慢或网络响应过慢,直接会导致登录时会卡一下。
可以完全使用HttpWebRequest的异步方法获取响应

class HttpAsynGet
{
public HttpAsynGet(string url)
{
this.Url = url;
request = (HttpWebRequest)WebRequest.Create(Url);
}
public string Url
{
get;
set;
}
private HttpWebRequest request;
public HttpWebRequest Request
{
get
{
return request;
}
}
public void DO()
{
request.BeginGetResponse(ProcessResponse, this);
}
private void ProcessResponse(IAsyncResult ar)
{
HttpAsynGet item = (HttpAsynGet)ar.AsyncState;
using (HttpWebResponse response = (HttpWebResponse)item.request.EndGetResponse(ar))
{
if (response.StatusCode == HttpStatusCode.OK)
{
Console.WriteLine(response.ContentLength);
Console.WriteLine(new string('=', 20));
}
else
{
Console.WriteLine(response.StatusDescription);
}
this.request.Abort();
}
}
}

调用:
HttpAsynGet get = new HttpAsynGet("xxxxxx");
get.DO();
即可。
在.Net FrameWork的一些类中,只要有以Begin..../End....开头的方法说明该类的这些方法支持异步操作。

.net中的Provider模式

2008-09-23

自.net 2.0出世时,Provider模式就随处可见了,如:MembershipProvider、SiteMapProvider等,
它的出现使我们的应用程序有了更大的扩展性,可以是一个数据工厂的提供者,也可以是一个逻辑处理的提供者。
而实现这种模式却是相当的简单,只需实现以下四步即可:
1、定义一个类,抽象出我们所需要的操作,基类为ProviderBase
如:

public abstract class RssProvider : ProviderBase
{
public abstract void LoadRss();
public abstract void AddRss();
}

2、实现一个Section,用来从配置文件中读取Provider的相关配置,该类继承于ConfigurationSection

public class RssProviderSection : ConfigurationSection
{
[ConfigurationProperty("providers")]
public ProviderSettingsCollection Providers
{
get { return (ProviderSettingsCollection)base["providers"]; }
set { base["providers"] = value; }
}

[StringValidator(MinLength=1)]
[ConfigurationProperty("defaultProvider", DefaultValue = "XmlProvider")]
public string DefaultProvider
{
get { return (string)base["defaultProvider"]; }
set { base["defaultProvider"] = value; }
}
}
public class RssProviderCollection : ProviderCollection
{
//从索引器中获取指定名称的Provider
public new RssProvider this[string name]
{
get
{
return (RssProvider)base[name];
}
}

public override void Add(ProviderBase provider)
{
if (provider == null)
{
throw new ArgumentNullException("provider");
}
if (provider is RssProvider)
{
base.Add(provider);
}
}
}

3、在调用时用RssProviderSection去读取配置文件,并加载指定的Provider

public class RssService
{
private static RssProvider _provider;
private static RssProviderCollection _providers;
private static readonly object obj = new object();
public static RssProvider Provider
{
get
{
LoadProvider();
return _provider;
}
}
public static RssProviderCollection Providers
{

get {
LoadProvider();
return _providers; }
}

public static void LoadProvider()
{
if (_provider == null)
{
lock (obj)
{
if (_provider == null)
{
RssProviderSection section = (BlogProviderSection)System.Configuration.ConfigurationManager.GetSection("Blog/RssService");
_providers = new RssProviderCollection();
ProvidersHelper.InstantiateProviders(section.Providers, _providers, typeof(BlogProvider));
_provider = _providers[section.DefaultProvider];
if (_provider == null)
throw new ProviderException("null");
}
}
}
}
}

4、配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="Blog">
<section name="RssService" type="ClassLib.BlogProviderSection,ClassLib"/>
</sectionGroup>
</configSections>
<Blog>
<RssService defaultProvider="XmlProvider">
<providers>
<add name="XmlProvider" type="ClassLib.XmlProvider,ClassLib"></add>
<add name="SqlProvider" type="ClassLib.SqlProvider,ClassLib"></add>
</providers>
</RssService>
</Blog>
</configuration>

更多内容可以去MSDN查阅ProviderBase基类

武汉的筒子们出来啦

2008-09-23

本月30号晚上17:35到达天河机场
接机的同学们要提前来啊~~
预计5日晚上回上海,方便的同学可以代我购二张火车票^_^
回家后我要逛东湖、走长江大桥、看长江、吃精武鸭脖、逛逛老地方。
还要去虎泉大排档体会一下堕落的感觉,好好吃一下在上海很难吃到的剥皮鱼。

另外,blog上次更新后去掉了二个html控件,导致无法发表评论,现已修复,谢谢QQ上一位尚未谋过面的朋友。
同志们,出来啊~~~

DatePicker控件

2008-09-19

http://www.dynarch.com/projects/calendar/的javascript日期选择器做了.net下的封装。
效果:

属性:

Theme:日期选择器样式,内置7种。
MinYear:最小年份
MaxYear:最大年份
DisplayTime:是否显示时间
Text:选中的日期值
在.cs中可以用DatePicker.Text来获取
唯一的事件TextChanged,当文本框中的值被更改时触发。

下午在调试时发现无法跟进IPostBackDataHandler.LoadPostData
郁闷了半天,网上查查才知道是当自定义控件中有<input type=”text”时,该Input要有Name属性。
DatePicker.rar (24.95 kb)

你真的了解Server.MapPath吗?

2008-09-17

MapPath方法,返回与 Web 服务器上的指定虚拟路径相对应的物理文件路径。
先看一张图:

说明:
站点voteengine的主目录为F:worksP080430_01_VoteEngineV4DEVELOPSOURCEweb
public为虚拟目录,指向E:CaptureImages
public下的note为虚拟目录,指向F:bin
upload目录不存在
看看下面的代码:
string[] s = new string[] { "", "", "","" };
s[0] = Server.MapPath("~/upload/");
s[1] = Server.MapPath("~/public/");
s[2] = Server.MapPath("~/public/note");
s[3] = Server.MapPath("~/public/")+"note";
foreach (string item in s)
{
Response.Write("<br />" + item);
}

请问最终将输出什么?

天气预报控件

2008-09-17

数据源取自:http://weather.msn.com/

原本是打算直接获取页面源代码,然后分析出需要的结果。
但这有二个弊端:
1、如果页面结构改了,我就得重写代码;
2、图片地址要转成绝对路径。
不小心让我发现msnweather提供了每个城市的天气预报rss
遂直接取rss内容即可。
直接将控件放到工具箱, 拖放到.aspx页面上,设置RSS地址即可
rss地址可以到这里来获取:
http://weather.msn.com/region.aspx?wealocations=China
可以有多个控件,设置不同的rss地址即可显示多个不同城市的天气预报。
理论上天气预报会缓存10分钟
效果:

文件下载:
WeatherLib.dll (12.00 kb)

再游西湖

2008-09-12

这几天疯狂地抽疯~~
本来是中秋回武汉,结果订票点完全买不到票。
在taobao上找到一卖家弄票,票是弄到了,可惜不是我要的z27次,而是k11次,还是硬座。
orz,15小时,屁股得开花啊,只能放弃了。不过还是非常地感谢那位朋友,春节我还找您:)

本来是国庆回河北,一想好久没回家了,一抽疯在携程上订了30号回武汉的机票(很服了自己),现在机票已在手。
解决了国庆再来解决中秋,Apple这段时间巨忙,于是乎想到去杭州散散心吧。
携程上所以我看得上的酒店全部都没有了房间,有房间的是我住不起的套房……
怿飞也抱怨说我每次不提前搞定这些事情-_-,我也是临时决定的嘛。
还好有热心的科比同学帮忙搞定住宿,太感谢了!
提前从公司出来买去杭州的火车票,骑车回家的途中突然下起大雨,浑身湿透!
票也有了,住的也有了,就只等明天上车了~~

“五一”的杭州之行还历历在目,那时太热,实在是没有玩好。
明天杭州会下起小雨,雨中游西湖又会是一番怎样的景象呢?

另外B4一些人肉spammer,再闹就封你IP了。我实在是不想将评论弄成审核的机制。

最后祝大家中秋节快乐!

CSS之生成内容

2008-09-09

注:IE8以前的版本均不支持该特性
为了向文档中插入生成内容,可以使用:before与:after伪元素。

如,我想在所有链接的后面加上”(link)”,可以这样:


运行代码

也可以插入图片:


运行代码

当然,还有插入属性值:

a[href]:after{content:attr(href);}
这样会将链接的href属性写在链接之后


运行代码

FaceYourManaga,创建你自己的卡通头像吧

2008-09-08

记得微软曾经推出过类似的服务,
不过当时需要上传一张照片,然后再生成。
今天发现的FaceYourManaga跟当时微软推出的服务比较类似,
不过他不需要你上传一张本地照片,只需在线涂鸦、拼接即可。
看我的

感觉挺好玩的
不过,不知道它是否提供了像Gravatar那样的”全球个性头像”服务。

香辣炒蟹

2008-09-07

早上去菜市场,发现大闸蟹上市了,遂买了4只。
二只清蒸,以前都是这样做的。

后来决定二只清蒸,二只香辣。
香辣的做法:
1、准备300g蟹,放在水中让它们吐吐泡,吐出体内的污垢。
2、杀死蟹,并砍成小段,并裹上淀粉。
3、准备油锅,放入适量的植物油,等油热后将砍成段的蟹倒入油锅中翻炸,待其表面呈金黄色时捞出沥油。
4、锅中留适量的油,将生姜切成丝,蒜头切成蒜丁放入锅中,并同时放入干辣椒、花椒,生姜呈金黄色时放入蟹。
5、倒入料酒、酱油、醋、盐、白糖翻炒均匀后起锅即可。