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

简介:   大家知道,SharePoint 2010支持客户端的对象模型访问,主要有三种方式:  1..net 的客户端对象模型,2.Javascript 的客户端对象模型 3.Silverlight的客户端对象模型,这里就简单实现一个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的客户端访问模型,欢迎大家讨论。

目录
相关文章
|
9天前
|
开发框架 算法 .NET
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
|
9天前
|
开发框架 Cloud Native .NET
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
|
2月前
|
开发框架 安全 .NET
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱。它不仅加速了应用开发进程,提升了开发质量和可靠性,还促进了创新和业务发展,培养了专业人才和技术社区,为软件开发和数字化转型做出了重要贡献。
37 5
|
2月前
|
传感器 人工智能 供应链
.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。
本文深入探讨了.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。通过企业级应用、Web应用及移动应用的创新案例,展示了.NET在各领域的广泛应用和巨大潜力。展望未来,.NET将与新兴技术深度融合,拓展跨平台开发,推动云原生应用发展,持续创新。
49 4
|
2月前
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
46 3
|
2月前
|
敏捷开发 缓存 中间件
.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素
本文深入探讨了.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素,并通过企业级应用和Web应用开发的实践案例,展示了如何在实际项目中应用这些模式,旨在为开发者提供有益的参考和指导。
43 3
|
2月前
|
开发框架 安全 Java
.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力
本文深入探讨了.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力。.NET不仅支持跨平台开发,具备出色的安全性和稳定性,还能与多种技术无缝集成,为企业级应用提供全面支持。
37 3