一个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.Main
Page"

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:DesignW
idth="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的客户端访问模型,欢迎大家讨论。

时间: 2025-01-21 12:52:57

一个Silverlight的网页访问计数器的相关文章

一起谈.NET技术,一个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中.下面介绍具体的步骤:

用vs2010做一个用户登录网页 访问本地的数据库

问题描述 http://zhidao.baidu.com/link?url=DJjq2sxXYkx1cRKIZC0QYwQyQcP9Fj8G8Edk1fXgF7ba13K_1-Nq0m6UXAd0mzVuKUXdtKkYH1w2unGVVdIY8_可以和这个类似但是要访问本地数据库菜鸟一只实在不会啊,先建立一个数据库UserTest.2,在里面建立一个表叫UsersTable,设计表,建立三个列:u_id,u_name,u_pwd.3,u_id是int数据类型,自增1:u_name是nvarch

php简单自主开网页访问次数计数器代码

这里是我们用php教程简单自主开网页访问次数计数器代码偌,是一款基于文件的图形计数器范例代码,会用到的文件用 num.txt //累计访问次数 vist.php//测试文件 count.php//统计访问次的核心程序,因为它会把文字转换成gif图片,并且输出到浏览器. <HTML> <HEAD> <TITLE>图形计数器范例</TITLE> </HEAD> <BODY> 您好,您是第<img src="ImgOutFi

一个使用TXT文本的JSP网站访问计数器(不用任何数据库)

js|访问|计数器|数据|数据库 //counter.java 读写文件的一个bean=========================== //网站读写txt格式计数器 package net.com.util;  import java.io.*;  public class Counter extends Object { private String currentRecord = null;//保存文本的变量 private BufferedReader file; //Buffere

JSP实现网页访问统计_JSP编程

最近学习Jave EE 中的jsp网页开发,需要实现网页访问量的统计,刚开始不知道如何实现,后来问了一下老师,老师是这样回答我的:要实现网页访问的统计,你可以利用application对象来实现,不能用seesion对象,因为session是属于同一个会话的,关掉浏览器数据就没有了,而application是在同一浏览器下的,只要是同一个浏览器,将数据保存在applicaiton对象中,这样就可以保证数据的不变性.其实这些我都懂,我只是不知道如何在jsp用代码实现.后来我只能上网看看有没有具体的

解决IE7频繁弹出“确实允许此网页访问剪贴板吗”的问题

每次用IE7进51CTO论坛及其他网站或博客,在发贴复制粘贴的时候,一般会弹出一个对话框"确 实允许此网页访问"剪贴板"吗?让人不胜其烦.现在我们就来彻底搞定这个问题,说来解决 方法也比较简单. 这是因为IE7.0增强了安全设置.如果IE的安全级别设置为默认或更高安全级别,那么在博客发贴或论 坛发贴粘贴时就会弹出这个提示.即使点了"允许访问"后,下次依然会出现提示,让人觉得 很麻烦.而原来的IE6.0则没有这个提示.解决办法很简单,就是打开"工具

锁-我遇到的问题是,一个页面在连接访问一段时间后会禁止访问。但是换个浏览器就可以继续访问。这个怎么破?

问题描述 我遇到的问题是,一个页面在连接访问一段时间后会禁止访问.但是换个浏览器就可以继续访问.这个怎么破? 我遇到的问题是,一个页面在连接访问一段时间后会禁止访问.但是换个浏览器就可以继续访问.这个通过cookie进行封锁的网页怎么抓取,前提是没有登录.他是一个cookie有一定的访问次数限制,到达次数后就会被疯掉,然后换一个浏览器就可以继续访问 解决方案 你爬虫还用浏览器?用服务器端httprequest对象,httprequest不附带cookie,每次会启用新会话 解决方案二: 我用的h

中国用户已经无法通过客户端和Web网页访问Dropbox

昨天下午,世界上最伟大的云存储服务之一--Dropbox被证实无法从中国地区访问,客户端和网站均无法正常连接和登录,我先前曾经多次推荐过这个伟大的服务,没想到这么快Dropbox也被封了-- 最近DropBox忽然成了一个小小的热点,就我视野所及,有两个名博写了关于它的博文,一篇是月光的,Dropbox的运营模式分析,一篇是阮一峰的,他把dropbox官方的一个ppt翻译成了中文:Dropbox 的创业经历.我也用这个东东,不过我不太记得是什么时候开始用的,大概是去年吧.我在我的blog侧边栏挂