帖子标记记录

Silverlight的航行日志记录在3测试版

我最近一直在打我的Web服务器 - 我最近从一个托管ASP.NET服务切换到一个虚拟专用服务器,所以我得到一个机会,有玩了我的第一次服务器的完全控制。我花了一段时间成立伐木和服务器上的统计使用IIS的日志记录功能和一些第三方的日志处理软件。经该测井资料是非常宝贵的除其他事项外 - ,它帮助我知道哪些网页乡亲有兴趣,并让我深入了解是否它太难以达到我的网页中的某些章节。随着导航控件在Silverlight 3测试版SDK的同时,有一个记录解决方案,我的网络服务器与合作,似乎只有谨慎!

蒂姆豪雅表有一个伟大的博客12月有关使用后从Silverlight应用程序与谷歌分析事件跟踪的 。我的印象是,这种做法将工作与控制以及新的导航,但我是IIS寻找一个简单的解决方案,将新增项目到我直接从Silverlight应用(原木,而不必添加任何JavaScript或使用HTML桥)。

眼下的问题是,导航控制后使用的“#”符号在URL的URI片段(文字),以确定哪些网页浏览到一个框架控件。结果(这是正确的),deeplinks到的Silverlight控制或导航发生在Silverlight控件从未往返服务器,所以没有办法让服务器日志的发生。

因此,我的方法相当简单:一个HTTP请求到服务器托管,它将记录任何时候我的框架是导航。

在实验过程中我的要求:

  • 再利用内置的日志我的Web服务器(IIS 7中的功能,但我想这将工作更广泛地)
  • 确保在我的申请记录个人独特的URI(以便查询字符串,自定义的URI等不会丢失数据的记录)
  • 避免限制,要求桥是可访问的HTML或需要其他文件的应用程序被添加到我的网站如JavaScript文件或其他ASP.NET页面()

原来,这是不那么困难的事!我的项目开始与Silverlight的导航应用程序模板,船舶与Silverlight的3 Beta版的Visual Studio工具来混合出在这。我得到这个项目模板设置一些与一帧,页,并导致一些按钮框架导航 - 一切一新生导航应用程序需要做大,做强!

我在开始处理MainPage.xaml框架控件的“航海下西洋”事件:

  : Frame x : Name ="Frame" Source ="/Views/HomePage.xaml" < 导航   X: 名称 =“框架”  =“/查看/ HomePage.xaml” 
                    导航 =“Frame_Navigated” 
                    HorizontalContentAlignment =“拉伸” 
                    VerticalContentAlignment =“拉伸” 
                    填充 =“15,10,15,10” 
                    背景 =“白”/> 

用简单的一部分的方式进行(谁知道?),我开始与WebRequest和WebClient的比赛,直到我想出了一些似乎符合我的需求了:

 sender, NavigationEventArgs e) { Uri uri = new Uri ( Application .Current.Host.Source.ToString() + "?nav=" + Uri .EscapeDataString(e.Uri.ToString())); WebRequest wc = WebRequest .Create(uri); wc.Method = "POST" ; wc.BeginGetResponse((res) => { WebResponse wr = wc.EndGetResponse(res); }, this ); } 私人无效 Frame_Navigated( 对象发件人,NavigationEventArgs五)( 乌里的uri =  的Uri(应用 。Current.Host.Source.ToString()+“?资产净值=”+ 乌里 。EscapeDataString(e.Uri.ToString ())); 的WebRequest WebRequest的厕所=。创建(URI)的; wc.Method =“POST”的 ; wc.BeginGetResponse((水库)=>“(= wc.EndGetResponse WebResponse水利(水库);), 这一点 );) 

我会走过这条路线逐线,并解释我的想法:

  Uri ( Application .Current.Host.Source.ToString() + "?nav=" + Uri .EscapeDataString(e.Uri.ToString())); 乌里的uri =  的Uri(应用 。Current.Host.Source.ToString()+“?资产净值=”+ 乌里 。EscapeDataString(e.Uri.ToString ())); 

在这里,我需要拿出一个文件我知道这样做对服务器上存在了,这是不会有任何语义,我会被要求作出了压倒一切的。此外,我想选择一个文件,将唯一标识的Silverlight应用程序正在请求。似乎合乎逻辑,然后使用我为此Silverlight应用程序的XAP文件!接下来,我添加了一个查询字符串将要发送到服务器,将独特的识别的URI,该框架使用。结果,如果源URI为“/查看/ HomePage.xaml”(如在XAML中所示),由此产生的URI是:“http://yourservername.com/yourSilverlightApp.xap?资产净值=%2FViews%2FHomePage.xaml。“好吧,好吧,这不是漂亮(感谢URI的编码),但它的把戏。查询字符串这里从来没有被使用,但它确实可以发送到服务器,并记录,其中留下的痕迹正是我一直在寻找我!

下一篇:

  .Create(uri); WebRequest的厕所= 的WebRequest。创建(URI)的;
 wc.Method =“POST”的 ; 

从上述两行的重要收获是,我用的HTTP POST方法。我花了一堆时间尝试使用GET,使测井发生,但它有两个重要的缺点:

  • 每个请求将重新下载的XAP,这是远远比我想更多的数据传输只是为了让伐木去
  • WebRequest和WebClient中都使用浏览器的缓存(我无法找到一个替代方法,不涉及修改查询字符串,这将有凿沉我的方法),这样重复,在Silverlight应用程序访问到相同的页面没有其实永远到达服务器并获得登录

最后:

 ); wc.BeginGetResponse((水库)=>“(= wc.EndGetResponse WebResponse水利(水库);), 这一点 ); 

这只是拍摄过的Web请求。没有什么特别突出的在这里指出,除了反应是完全被忽略。

就是这样!

下面是直接从我的IIS的证明,在W3C的日志格式(...知识产权的节录):

2009年5月13日4时41分06秒的POST /样本/ LoggedSilverlightNavigation /为ClientBin / LoggedSilverlightNavigation.xap资产净值=%2FViews%2FAboutPage.xaml - <IP地址>Redacted> HTTP/1.1中Mozilla/4.0 +(兼容; +的MSIE +8.0; +视窗+新台币6.1; +的WOW64; + Trident/4.0; + SLCC2; +。NET中的CLR +2.0.50727 +; +。NET中的CLR +3.5.30729 +; +。NET中的CLR +3.0.30729 +,+ +媒体中心+电脑6.0) - 405 1496

2009年5月13日4时41分06秒的GET /饲料= rss2 - <IP地址>Redacted> HTTP/1.1中Windows-RSS-Platform/2.0 +(的MSIE 8.0; + +的Windows NT的6.1) - 304 475

2009年5月13日4时41分06秒的POST /样本/ LoggedSilverlightNavigation /为ClientBin / LoggedSilverlightNavigation.xap资产净值=%2FViews%2FHomePage.xaml - <IP地址>Redacted> HTTP/1.1中Mozilla/4.0 +(兼容; +的MSIE +8.0; +视窗+新台币6.1; +的WOW64; + Trident/4.0; + SLCC2; +。NET中的CLR +2.0.50727 +; +。NET中的CLR +3.5.30729 +; +。NET中的CLR +3.0.30729 +,+ +媒体中心+电脑6.0) - 405 1496

2009年5月13日4时41分08秒的POST /样本/ LoggedSilverlightNavigation /为ClientBin / LoggedSilverlightNavigation.xap资产净值=%2FViews%2FAboutPage.xaml - <IP地址>Redacted> HTTP/1.1中Mozilla/4.0 +(兼容; +的MSIE +8.0; +视窗+新台币6.1; +的WOW64; + Trident/4.0; + SLCC2; +。NET中的CLR +2.0.50727 +; +。NET中的CLR +3.5.30729 +; +。NET中的CLR +3.0.30729 +,+ +媒体中心+电脑6.0) - 405 1496

2009年5月13日4时41分08秒的POST /样本/ LoggedSilverlightNavigation /为ClientBin / LoggedSilverlightNavigation.xap资产净值=%2FViews%2FHomePage.xaml - <IP地址>Redacted> HTTP/1.1中Mozilla/4.0 +(兼容; +的MSIE +8.0; +视窗+新台币6.1; +的WOW64; + Trident/4.0; + SLCC2; +。NET中的CLR +2.0.50727 +; +。NET中的CLR +3.5.30729 +; +。NET中的CLR +3.0.30729 +,+ +媒体中心+电脑6.0) - 405 1496

而更多的证据从我的第三方统计工具(无视大转移规模...他们是我的测试GET方法,其中移送几百KB的每个请求)工件:

AWStats Screenshot showing LoggedSilverlightNavigation.xap being queried

如果你好奇下载的代码(它并不比你已经看到了!),在这里你可以找到它: LoggedSilverlightNavigation.zip

有一定还有改进的余地的,但。有一件事情我想要得到的工作最终是设置HTTP请求标头的引荐到一个连贯的价值,这样我可以跟踪人们从我的页面到页面中的应用-但这是一个很好的第一步。

我希望您发现有帮助!如果任何人有任何/技巧/导航过关其他建议,请随时让我知道!这只是我的实验结果,所以如果你有一个更好的方式,随时评论!

聚苯乙烯仍然没有正确的反应狩猎从我上次张贴到我的复活节彩蛋!不要放弃!我会后回答这个星期晚些时候。

聚苯硫醚马克怪物有很大的博客员额从几个月前他对Silverlight的跟踪分析支持谷歌 。我想像你可以使用类似的技术来完成此类型的日志记录我做的事。

6评论