您的位置:首页 > 理论基础 > 计算机网络

在Silverlight开发基于http协议客户端连接器(二)

2010-09-02 17:43 363 查看
上一篇中我们能够通过自己的WebClientEx与web应用进行通讯,这样我们就能像js中使用ajax那样异步的通过xml或json等格式进行数据收发了。

不过每次都让人家new 一个WebClientEx对象,手动传URI不说,还要管理一个共享的CookieContainer就显得笨拙了。

好吧,我们提供Message基类和一个连接器的上下文类WebConnectorContext。

Message中包含一个消息号(MessageId),一个Parameters字典。另外一个CurrentParameterUrlPart属性,该属性会自动将当前的baseurl与parameters进行拼接,过滤无效参数然后返回一个完整的url。对于一个自定义消息可以从Message继承过来,设置一下有效参数即可。

WebConnecorContext对外只提供一个AddMessageToSend方法,在该方法中设置Message和回调即可。

WebConnectorContext

public class WebConnectorContext
{
private List<WebClientWrapper> _asyncTasks;
private string baseAddress;
public WebConnectorContext(string baseAddress)
{
this.baseAddress = baseAddress;
init();
}
private CookieContainer _cookie = new CookieContainer();
private object _cookieDataLocker = new object();
public CookieContainer AppCookie
{
get
{
lock (_cookieDataLocker)
{
return _cookie;
}
}
protected set
{
lock (_cookieDataLocker)
{
_cookie = value;
}
}
}
private void init()
{
_asyncTasks = new List<WebClientWrapper>();
}
public virtual void AddMessageToSend(Message msg, Action<WebClientWrapper, string> action)
{
var task = new WebClientWrapper()
{
Message = msg
};
task.DownloadStringCompleted += (s) => OnResultReceived(task, s, action);
_asyncTasks.Add(task);
task.SendAsync(baseAddress, AppCookie);
}
private void onResultReceived(WebClientWrapper task, string e, Action<WebClientWrapper, string> action)
{
if(action != null)
action(task, e);
_asyncTasks.Remove(task);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐