很喜欢Silverlight,可能以前比较喜欢Flash制作的缘故吧,只是最后还是从事了 winForm的开发,毕竟WinForm的工作比较好找,自己的美工技术也一般。
这段时间一直在学习Silverlight之中,边学习边写博客吧,希望能和朋友们一起分享Silverlight的快乐。同时能解决一些实际中的问题,毕竟现在Silverlight的资料还是太少了。
言归正传:
1、起初我的想法是直接利用从CodeProject中下载的Racoom的动态库,并采用数据绑定的方式来直接完成Rss的阅读,估计可能只要一个小时。事实证明这种方法是行不通的,因为Silverlight对很多类库都不支持,必须使用Silverlight本身的动态库才可以。
2、那怎么办?自己重写一个吧,新建一个Silverlight库,创建一个RSSChannel,
Code
public class RssChannel
{
public RssChannel(string location)
{
Uri uri = new System.Uri(location);
HttpWebRequest request =(HttpWebRequest) WebRequest.Create(uri);
request.Method = "GET";
IAsyncResult result = request.BeginGetResponse(new AsyncCallback(RespCallback), request);
}
private void RespCallback(IAsyncResult result)
{
try
{
HttpWebRequest req = result.AsyncState as HttpWebRequest;
HttpWebResponse res = req.EndGetResponse(result) as HttpWebResponse;
Stream strm = res.GetResponseStream();
}
catch(Exception ex)
{
Console.Write(ex.Message);
}
}
}
最简单的方式,嘿嘿这样总行了吧。在Page页面中初始化实例,去访问我最常去的http://www.codeproject.com/webservices/articlerss.aspx?cat=1,
问题来了,拒绝访问,说是策略错误。啥鸟问题,这么复杂,Google一下吧,原来是没有CilentAccessPolicy.xml文件阿,OK,搞一个放在目录下
再次运行错误依旧,这么麻烦,继续Google,因为英文的居多,只好慢慢的看了。终于搞明白了,这个文件是要放到你要访问网站的根目录下才可以通过Silverlight去访问的。或者你的Silverlight应用程序要放到此网站下。How can i do???
3、咱不行可以曲线救国阿?自己创建一个WebService,把地址传进来,将解析好的数据传输去不就OK了。说干咱就干吧,听说WCF这东西挺好用的,创建一个WCF Service吧。在项目中新建一个Silverlight项目,选择 Add a new ASP.NET Web project to the solution to host silverlight.
直接运行一下,没有啥东西。右键选择New Item...,当时不知道还有一个Silverlight-enabled WCF Service,直接就选了个WCF Service,
引用Racoom的动态库,代码如下
Code
[ServiceContract]
public interface IRssService
{
[OperationContract]
List<RssXml.RssItem> GetRssItems(string location);
[OperationContract]
void DoWork();
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class RssService : IRssService
{
#region IRssService Members
List<RssXml.RssItem> IRssService.GetRssItems(string location)
{
Uri uri = new Uri(location);
RssChannel channel = new RssChannel(uri);
List<RssXml.RssItem> items = new List<RssXml.RssItem>();
for (int i = 0; i < channel.Items.Count; i++)
{
RssXml.RssItem item = new RssXml.RssItem();
item.Title = channel.Items[i].Title;
item.Comments = channel.Items[i].Comments;
item.Description = channel.Items[i].Description;
item.Link = channel.Items[i].Link;
items.Add(item);
}
return items;
}
#endregion
#region IRssService Members
public void DoWork()
{
string s = "Do it";
}
#endregion
}
想不到内容写起来还真多,只能明天晚上继续了(怎么感觉像天涯上骗回帖的)。
公告栏里有我的程序演示,如果显示报错,就是我没开服务器了。