一起谈.NET技术,一个Silverlight的网页访问计数器

  大家知道,SharePoint 2010支持客户端的对象模型访问,主要有三种方式:

  1..net 的客户端对象模型,2.Javascript 的客户端对象模型 3.Silverlight的客户端对象模型,这里就简单实现一个Silverlight的网页计数器,来达到熟悉客户端对象模型的目的。

  其实这个简单的访问计数器主要就是统计了页面刷新了多少次,逻辑很简单,当页面被load的时候,就将次数+1,将次数和页面的地址作为一个Item存放在一个SharePoint list中。下面介绍具体的步骤:

  1、准备工作:在SharePoint 2010的某一个site下创建用来存放访问次数和页面地址的list,我们可以取名为Hit Count list。

  2、VS2010中创建Silverlight Application Project,然后添加客户端对象模型的dll引用,在SharePoint2010中,Silverlight的支持客户端对象模型的dll文件一般存放在c:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\ClientBin下,所以我们在项目中先Add Reference,在上面的路径下添加Microsoft.SharePoint.Client.Silverlight.dll 和 Microsoft.SharePoint.Client.Silverlight.Runtime.dll两个dll。

  3、在项目中添加一个Class,ClientOMProxy.cs作为silverlight访问SharePoint2010数据的代理类,因为Silverlight访问采用异步的方式,所以几个基本的操作方法如下:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Xml;
using System.Net;
using Microsoft.SharePoint.Client;

namespace ADSK.AEC.SP2010.ClientOM
{
public class ClientOMProxy:IDisposable
{
private ClientContext clientContext = null;
public ListItemCollection listItems = null;
public ClientOMProxy(string siteURL)
{
this.SiteURL = siteURL;
clientContext = new ClientContext(this.SiteURL);
}

public void GetListItemsAsync(string listName, string viewXML, out ListItemCollection listItems, ClientRequestSucceededEventHandler successEventHandler, ClientRequestFailedEventHandler failEventHandler)
{
clientContext.Load(clientContext.Web);
List targetList = clientContext.Web.Lists.GetByTitle(listName);
clientContext.Load(targetList);
CamlQuery camlQuery = new CamlQuery();
camlQuery.ViewXml = viewXML;
listItems = targetList.GetItems(camlQuery);
clientContext.Load(listItems);
clientContext.ExecuteQueryAsync(successEventHandler, failEventHandler);
}

public void CreateListItemAsync(string listName, Dictionary<string, object> fieldValueDic, ClientRequestSucceededEventHandler onSuccess, ClientRequestFailedEventHandler onFail)
{
clientContext.Load(clientContext.Web);
List targetList = clientContext.Web.Lists.GetByTitle(listName);
clientContext.Load(targetList);
ListItemCreationInformation itemCreateInfo = new ListItemCreationInformation();
ListItem oListItem = targetList.AddItem(itemCreateInfo);
foreach (KeyValuePair<string, object> pair in fieldValueDic)
{
oListItem[pair.Key] = pair.Value;
}
oListItem.Update();
clientContext.Load(oListItem);
clientContext.ExecuteQueryAsync(onSuccess, onFail);
}

public void UpdateListItemAsync(string listName, ListItem item, Dictionary<string, object> fieldValueDic, ClientRequestSucceededEventHandler onSuccess, ClientRequestFailedEventHandler onFail)
{
clientContext.Load(clientContext.Web);
List targetList = clientContext.Web.Lists.GetByTitle(listName);
clientContext.Load(targetList);
ListItem oListItem = item;
foreach (KeyValuePair<string, object> pair in fieldValueDic)
{
oListItem[pair.Key] = pair.Value;
}
oListItem.Update();
clientContext.Load(oListItem);
clientContext.ExecuteQueryAsync(onSuccess, onFail);
}

public void Dispose()
{
if (null != clientContext)
clientContext.Dispose();
}
}
}

  其中的ClientRequestSucceededEventHandler onSuccess, ClientRequestFailedEventHandler onFail分别为异步操作成功和失败后的回调委托,可以在调用方法的时候传出这两个委托的具体实现。由于是客户端程序,所以真正的操作都是在ExecuteQueryAsync方法调用时才开始执行的。

   4、在Main.xaml中添加页面UI:


<UserControl xmlns:dataInput="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input" x:Class="ADSK.AEC.SP2010.Portal.HitCount.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">

<Grid x:Name="LayoutRoot" Background="White" HorizontalAlignment="Left">
<Border CornerRadius="5" BorderThickness="2" BorderBrush="#B8BABD" Width="80" Height="40">
<StackPanel >
<TextBlock x:Name="txtHitName" FontFamily="Verdana" FontSize="10" Padding="2" Text="Page Hits" HorizontalAlignment="Center" VerticalAlignment="Center" FontStretch="ExtraExpanded">
</TextBlock>
<TextBox x:Name="txtHitCount" Text="" Foreground="Blue" FontSize="10" Padding="0" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" FontStretch="UltraCondensed" BorderThickness="0"></TextBox>
</StackPanel>
</Border>
</Grid>
</UserControl>

  用一个textbox来显示访问次数,在main.xaml.cs中添加实现逻辑:


public partial class MainPage : UserControl
{
private ADSK.AEC.SP2010.ClientOM.ClientOMProxy clientProxy = null;
private ListItemCollection targetHitCount = null;
public MainPage(string siteUrl)
{
InitializeComponent();
string currentPageURL = HtmlPage.Document.DocumentUri.ToString();
string viewXML = @"<View><ViewFields><FieldRef Name='HitCount'/></ViewFields><Query><Where><Eq><FieldRef Name='Title'/><Value Type='Text'>" + currentPageURL + "</Value></Where></Eq></Query></View>";
clientProxy = new ClientOM.ClientOMProxy(siteUrl);
clientProxy.successEventHandler += new ClientRequestSucceededEventHandler(OnRequestSucceeded);
clientProxy.failEventHandler += new ClientRequestFailedEventHandler(OnRequestFailed);
clientProxy.GetListItemsAsync("Hit Count", viewXML, out targetHitCount);
}

private void BindData()
{
if (targetHitCount != null && targetHitCount.Count != 0)
{
long hitCount = Convert.ToInt64(targetHitCount[0]["HitCount"].ToString());
txtHitCount.Text = (hitCount + 1).ToString();
lock (targetHitCount[0])
{
Dictionary<string, object> fieldValueDic = new Dictionary<string, object>();
fieldValueDic["HitCount"] = hitCount+1;
clientProxy.UpdateListItemAsync("Hit Count", targetHitCount[0], fieldValueDic, null, null);
}
}
else
{
txtHitCount.Text = "1";
Dictionary<string, object> fieldValueDic = new Dictionary<string, object>();
fieldValueDic["Title"] = HtmlPage.Document.DocumentUri.ToString();
fieldValueDic["HitCount"] = 1;
clientProxy.CreateListItemAsync("Hit Count", fieldValueDic, null, null);
}
}

private void OnRequestSucceeded(Object sender, ClientRequestSucceededEventArgs args)
{
Dispatcher.BeginInvoke(BindData);
clientProxy.Dispose();
}

private void OnRequestFailed(Object sender, ClientRequestFailedEventArgs args)
{
clientProxy.Dispose();
}

  逻辑比较简单,这里就不详细解释了。在App.xaml.cs中的Startup事件中添加读入参数的方法:


private void Application_Startup(object sender, StartupEventArgs e)
{
string siteUrl = e.InitParams["SiteUrl"];
siteUrl = System.Windows.Browser.HttpUtility.UrlDecode(siteUrl);
this.RootVisual = new MainPage(siteUrl);
}

  OK,build一下,先在客户端调试一下,这里注意了,如果你机器安装过360的浏览器的话,那么有可能调试的时候无法进入断点,保险的方法还是将IE设置为默认浏览器,然后调试。

  5、将生成的.xap文件上传到SharePoint2010的一个Document library中,在任意一个你想统计访问次数的页面上Add web part,选择Silverlight web part,在url中添加xap上传的路径,然后在Other Settings中添加外部传入参数,形式为SiteUrl = hit count list 所属site的url。

  完成以后,可以看见页面上已经有了访问次数统计了:

  这里只是简单的创建了一个页面次数访问的统计器,关键还是熟悉了SharePoint2010下Silverlight的客户端访问模型,欢迎大家讨论。

时间: 2024-10-24 13:40:21

一起谈.NET技术,一个Silverlight的网页访问计数器的相关文章

一个Silverlight的网页访问计数器

大家知道,SharePoint 2010支持客户端的对象模型访问,主要有三种方式: 1..net 的客户端对象模型,2.Javascript 的客户端对象模型 3.Silverlight的客户端对象模型,这里就简单实现一个Silverlight的网页计数器,来达到熟悉客户端对象模型的目的. 其实这个简单的访问计数器主要就是统计了页面刷新了多少次,逻辑很简单,当页面被load的时候,就将次数+1,将次数和页面的地址作为一个Item存放在一个SharePoint list中.下面介绍具体的步骤: 1

SharePoint 2010实现一个Silverlight的网页访问计数器

大家知道,SharePoint 2010支持客户端的对象模型访问,主要有三种方式 1..net 的客户端对象模型,2.Javascript 的客户端对象模型 3.Silverlight的客户端对象模型,这里就简单实现一个Silverlight的网 页计数器,来达到熟悉客户端对象模型的目的. 其实这个简单的访问计数器主要就是统计了页面刷新了多少次,逻辑很简单,当页面被load的时候,就将次数+1,将次数和页面的地址 作为一个Item存放在一个SharePoint list中.下面介绍具体的步骤:

一起谈.NET技术,Silverlight的搜索引擎优化

什么是SEO,为什么它是如此重要? SEO(搜索引擎优化)是改善交通的数量和质量,从搜索引擎网站的过程. 这意味着,做搜索引擎优化您的网站将使其更具可转位及更多的人参观. 下面是你的规则应该坚持以做最好的搜索引擎优化几点: <title>标签应包含有关您网站的最重要的信息 最重要的内容应留在本页面(开始后<body>标记) 所有图像标记号(<img />)应界定上的Alt标签-这是搜索引擎理解什么是图像的唯一途径说' 简短的开场白,RIA的世界 如今,网络空间是完全不同

一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(二)纸娃娃系统

纸娃娃系统,或许大家听起来并不陌生.早在十几年前,当时不论是文字游戏"泥巴(Mud)"或是交友.社交网站,我们只能通过屏幕上的文字来传达与交互信息:随着技术不断进步,2D/3D图形技术高速崛起,通过在基础模型上由客户随意挑选.任意更换各种造型(素材),即可打造出真正属于"自我"独特风格的网络虚拟形象,QQ秀便是我们耳熟能详的代表,更贴近真实的如(RPG)游戏及虚拟现实中的换装/换肤系统同样亦得益于纸娃娃机制. 本节,我将向大家讲解如何最好的实现Silverlight

一起谈.NET技术,Silverlight 4.0发布之际,让我们重新再认识一次Silverlight这位乱世英雄!

Microsoft Silverlight是微软所发展的 Web 前端应用程序开发解决方案,是微软丰富型互联网应用程序Rich Internet Application(简称RIA)策略的主要应用程序开发平台之一,以浏览器插件形式,提供 Web 应用程序中多媒体(含影音流与音效流)与高度交互性前端应用程序的解决方案,同时它也是微软 UX(用户体验)策略中的一环. Silverlight与WPF的关系? 在理解Silverlight之前,需要先了解WPF为何方神圣,并在一定程度上深入理解WPF的原

一起谈.NET技术,Silverlight 应用整合

Silverlight与企业信息化 在企业应用系统中,企业客户不在满足于呆板的Portal.树形结构.数据堆积的表格和满屏的文字描述.企业客户越来越倡导用户体验,Silverlight迎合了这种需求,实现了炫目的体验和丰富交互的应用,更重要的是Silverlight更适合企业应用系统的开发,依靠.Net平台,使用C#高级语言代替JavaScript脚本语言,实现了强大的客户端计算能力.支持多线程,丰富的控件.特效与动画,更可控的浏览器适应性,更安全的沙箱模式,客户端嵌入式数据库等. 现在企业应用

一起谈.NET技术,Silverlight 结构分析

Silverlight是微软提供的一种Web前端应用程序开发框架,是微软RIA的主要应用程序开发平台.Silverlight以浏览器的插件方式,提供丰富的多媒体展示功能以及更多交互性的Web前端解决方案. 本文的重点在于探讨Silverlight的整体架构,以及Silverlight应用程序是如何在浏览器中运行的,各个子部分的作用是什么. 1.整体结构 Silverlight是以浏览器插件方式运行的,在安装完Silverlight后,我们来看一下安装目录:C:\ProgramFiles\Micr

一起谈.NET技术,Silverlight访问Apache服务器(Tomcat,Geronimo)中部署的Webservice

开发环境 Vs2010 . Silverlight4 . Java Jdk1.6 U 21 . Apache-tomcat-6.0.20 . Myeclipse8.5 . Apache-ant-1.8.1 . Axis2 . Geronimo-tomcat6-javaee5-2.2 下载地址: Apache-tomcat : http://apache.ziply.com/tomcat/ Apache-ant   : http://apache.ziply.com/ant/ Axis2 : ht

一起谈.NET技术,Silverlight 游戏开发小技巧:透明背景的Silverlight程序

一些朋友在玩窝窝世界的时候,发现官方网站上的进入入口程序是Silverlight,但是有趣的是一个透明背景的Silverlight程序,这个效果最早我也未找资料,在未来Silverlight程序会在各个方面应用,透明背景的效果就会涉及,这种效果预览如下: 下面一步一步的告诉大家这个小技巧,首先要准备一个Silverlight,然后将MainPage的填充色设置为透明的,还有LayoutRoot也是一样,我在这里用了一张来自网络的图片: 为了稳定,最好将MainPage的宽高定死,这样有助于我们在