Entradas con la etiqueta de registro

Tala de navegación en el Silverlight 3 Beta

He estado jugando últimamente con mi servidor web - Recientemente he pasado de un servicio alojado de ASP.NET en un servidor virtual dedicado, así que estoy recibiendo la oportunidad de jugar con tener un control total sobre mi servidor por primera vez. Pasé algún tiempo la creación de registro y estadísticas en el servidor usando la función de IIS tala y algún partido tercero de software de registro de cálculo. Tener ese registro de datos es muy valioso - entre otras cosas, me ayuda a saber qué gente páginas interesa y me da pistas sobre si el es demasiado difícil para llegar a ciertas secciones de mi página. Con la incorporación de controles de navegación en el SDK Beta de Silverlight 3, tener una solución de registro que coopera con mi servidor web parece prudente!

Tim Heuer tiene una gran entrada en el blog a partir de diciembre sobre el uso de seguimiento de eventos en Google Analytics para aplicaciones Silverlight . Mi impresión es que este enfoque funciona bien con los controles de navegación nuevo, pero yo estaba buscando una solución simple que agregar entradas a mi IIS registros directamente desde la aplicación Silverlight (sin tener que añadir ningún javascript o utilizar el puente de HTML).

El tema que nos ocupa es que los controles de navegación utiliza el fragmento de URI (texto después del signo "#" en la URL) para determinar qué página para navegar en un control Frame. Como resultado de ello (y con razón), enlaces profundos en el Silverlight control o de navegación que se produce nunca en el control de Silverlight de ida y vuelta al servidor, así que no hay manera para que el servidor de registro que se produzcan.

Por lo tanto, mi enfoque es bastante sencillo: hacer una petición HTTP al servidor de alojamiento que se registrará cualquier momento se navega mi ser.

Mi requisitos para el experimento:

  • Reutilizar el incorporado-en funciones de registro de mi servidor web (IIS 7, pero me imagino que este trabajo de manera más amplia)
  • Asegúrese de que los URI único dentro de mi solicitud se registran por separado (para cadenas de consulta, las URIs de aduana, etc no se pierden en los datos registrados)
  • Evitar limitación de la aplicación, al exigir el puente HTML para ser accesible o que requieren los archivos adicionales que se añadirán a mi sitio web (como archivos de Javascript o adicional páginas ASP.NET)

Resulta que esto no es tan difícil de hacer! Empecé con la navegación del proyecto de aplicación de Silverlight plantilla que se incluye con la Herramientas de Silverlight 3 Beta de Visual Studio que salió en el MIX. Esta plantilla de proyecto se me creó con un marco, algunos Páginas, y algunos botones que hacen que el marco de navegar - todo lo que un programa de navegación del recién nacido necesita para crecer grande y fuerte!

Empecé por el manejo del control Frame "Navigated" evento en MainPage.xaml:

 : Frame x : Name ="Frame" Source ="/Views/HomePage.xaml" Navigated ="Frame_Navigated" HorizontalContentAlignment ="Stretch" VerticalContentAlignment ="Stretch" Padding ="15,10,15,10" Background ="White"/> <Navegación: Marco x: Nombre = "Frame" Source = "/ Vista / HomePage.xaml" Navigated = "Frame_Navigated" HorizontalContentAlignment = "Stretch" VerticalContentAlignment = "Stretch" Relleno = "15,10,15,10" Background = " Blanco "/> 

Con la parte fácil del camino (¿quién sabe?), Comencé a jugar con WebRequest WebClient y hasta que se me ocurrió algo que parecía para satisfacer mis necesidades:

 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 ); } private void Frame_Navigated (object sender, NavigationEventArgs e) (Uri Uri uri nueva = (Aplicación. Current.Host.Source.ToString () + "? nav =" + Uri. EscapeDataString (e.Uri.ToString ())); WebRequest wc = WebRequest. Crear (URI); wc.Method = "POST"; wc.BeginGetResponse ((res) => (WebResponse wr = wc.EndGetResponse (res);), this);) 

Voy a caminar a través de esta línea por línea y explicar mi razonamiento:

  Uri ( Application .Current.Host.Source.ToString() + "?nav=" + Uri .EscapeDataString(e.Uri.ToString())); Uri uri = nuevo Uri (Application. Current.Host.Source.ToString () + "? Nav =" + Uri. EscapeDataString (e.Uri.ToString ())); 

Aquí, lo que necesitaba para llegar a un archivo que sabía que iba a estar presente en el servidor y que no es probable que tenga una semántica que voy a reemplazar al hacer una petición. Además, he querido elegir un archivo que identifican de forma única la aplicación Silverlight que está haciendo la solicitud. Parecía lógico, entonces para usar el archivo XAP para mi aplicación Silverlight para este fin! A continuación, añade una cadena de consulta que sería enviado al servidor que identificara la única URI que el marco está utilizando. El resultado, si el origen de URI es "/ Vista / HomePage.xaml" (como se muestra en el XAML), la URI resultante es: "http://yourservername.com/yourSilverlightApp.xap? nav =%% 2FViews 2FHomePage.xaml ". Ok, ok, no es bonita (gracias a la codificación de la URI), pero hace el truco. La cadena de consulta que aquí no se acostumbra, pero sí son enviadas al servidor y registra, lo que me deja con exactamente las huellas que estaba buscando!

Siguiente:

  .Create(uri); WebRequest wc = WebRequest. Crear (URI);
 wc.Method = "POST"; 

Los platos para llevar importantes de estas dos líneas es que he usado el método HTTP POST. Pasé un montón de tiempo tratando de usar GET para hacer el registro de suceder, pero tenía dos inconvenientes fundamentales:

  • Cada solicitud se volver a descargar la XAP, que fue mucho más datos que yo quería para transferir sólo para obtener el registro va
  • WebRequest WebClient y ambos utilizan la caché del navegador (y no pude encontrar una solución que no pretenden modificar la cadena de consulta, lo que habría hundido mi enfoque), por lo que repetidas visitas a la misma página en la aplicación Silverlight no nunca alcanzan realmente el servidor y se cierra la sesión

Por último:

  wc.BeginGetResponse ((res) =>
 (
     WebResponse wr = wc.EndGetResponse (res);
 ), This); 

Esto sólo dispara la solicitud Web. No hay nada particularmente especial aquí, aparte de señalar que la respuesta es totalmente ignorado.

Y eso es todo!

Aquí está la prueba, directamente desde mis registros de IIS (en formato de W3C ... IP redactada):

05/13/2009 04:41:06 POST / Samples / LoggedSilverlightNavigation / ClientBin / nav LoggedSilverlightNavigation.xap =%% 2FViews 2FAboutPage.xaml - <IP Redacted> HTTP/1.1 Mozilla/4.0 + (compatible; MSIE 8.0 +, + Windows NT 6.1 +; + WOW64; + Trident/4.0; + SLCC2; +. + NET CLR +2.0.50727; +. + NET CLR +3.5.30729; +. NET CLR + +3.0.30729; + Media + Centro de PC + 6.0) - 405 1496

05/13/2009 04:41:06 GET / feed = rss2 - <IP Redacted> HTTP/1.1 Windows-RSS-Platform/2.0 + (MSIE 8.0; + Windows + NT 6.1) - 304 475

05/13/2009 04:41:06 POST / Samples / LoggedSilverlightNavigation / ClientBin / nav LoggedSilverlightNavigation.xap =%% 2FViews 2FHomePage.xaml - <IP Redacted> HTTP/1.1 Mozilla/4.0 + (compatible; MSIE 8.0 +, + Windows NT 6.1 +; + WOW64; + Trident/4.0; + SLCC2; +. + NET CLR +2.0.50727; +. + NET CLR +3.5.30729; +. NET CLR + +3.0.30729; + Media + Centro de PC + 6.0) - 405 1496

05/13/2009 04:41:08 POST / Samples / LoggedSilverlightNavigation / ClientBin / nav LoggedSilverlightNavigation.xap =%% 2FViews 2FAboutPage.xaml - <IP Redacted> HTTP/1.1 Mozilla/4.0 + (compatible; MSIE 8.0 +, + Windows NT 6.1 +; + WOW64; + Trident/4.0; + SLCC2; +. + NET CLR +2.0.50727; +. + NET CLR +3.5.30729; +. NET CLR + +3.0.30729; + Media + Centro de PC + 6.0) - 405 1496

05/13/2009 04:41:08 POST / Samples / LoggedSilverlightNavigation / ClientBin / nav LoggedSilverlightNavigation.xap =%% 2FViews 2FHomePage.xaml - <IP Redacted> HTTP/1.1 Mozilla/4.0 + (compatible; MSIE 8.0 +, + Windows NT 6.1 +; + WOW64; + Trident/4.0; + SLCC2; +. + NET CLR +2.0.50727; +. + NET CLR +3.5.30729; +. NET CLR + +3.0.30729; + Media + Centro de PC + 6.0) - 405 1496

Y una prueba más, de mi partido tercera herramienta de Estadísticas (ignorar el tamaño de la transferencia de grandes ... son artefactos de mis pruebas el método GET, que transfirió unos pocos cientos de KB con cada solicitud):

AWStats Screenshot showing LoggedSilverlightNavigation.xap being queried

Si tienes curiosidad para descargar el código (no es mucho más que lo que ya has visto!), Puede encontrarlo aquí: LoggedSilverlightNavigation.zip

Definitivamente hay todavía mucho por hacer, sin embargo. Una cosa que me gustaría conseguir trabajo finalmente está estableciendo la cabecera referencial sobre la petición HTTP a un valor coherente para que pueda medir la cantidad de gente de página a página en mis aplicaciones - pero esto es un buen primer paso.

Espero que usted encuentre que útil! Si alguien tiene alguna otra sugerencia / tips / trucos para la navegación, no dude en hacérmelo saber! Esto fue sólo el resultado de mis experimentos, así que si tienes una mejor manera, no dude en comentar !

PS Todavía no hay respuestas correctas a mi Caza de huevos de Pascua de mi último mensaje: No te rindas! Voy a publicar la respuesta esta semana.

PPS Monster Mark tiene un gran post de hace unos meses una en su blog acerca de Silverlight de seguimiento de apoyo en Google Analytics . Me imagino que usted podría utilizar una técnica similar para realizar el tipo de registro que hago aquí.

, , ,

6 Comentarios