在今天做的小项目中 调用:
用户登录成功后要访问另一个应用的一个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....开头的方法说明该类的这些方法支持异步操作。
7 Comments
Leave a Reply
Using Gravatars in the comments - get your own and be recognized!
XHTML: These are some of the tags you can use: <a href=""> <b> <blockquote> <code> <em> <i> <strike> <strong>
幻想曲,又名臭蛋. ………….
妈的,你不更新博客了?
-_-
这个地方应用这个不错,可是,如果请求的页面的内容要在页面上显示的话,那要怎么做呢?恐怕就有问题了吧?
如果是同步,另一台服务器慢或者网络延迟,那显示的就慢,
如果是异步,怎么立即显示出来呢?在Page_Load里 Sleep个几秒吗?
我用你的rss reader就出了这个问题,要在页面上立即显示出来,可就是不显示
提交一个小bug,我提交评论后,我的评论上去了,可下面显示 #0,表明是第一个,可一刷新就正常了,貌似你没用js变量保存已经有的评论数目?
要立即显示的话,可以Sleep几秒
但这会导致整个页面都会被Sleep
这种情况的话可以采用Ajax了
或后台用ICallbackEvent