davidpoll.com
Articles taggés avec l'exploitation forestière
L'exploitation forestière dans la navigation Silverlight 3 Beta
Posté par david.poll de Silverlight sur le 12 mai 2009
Je joue autour récemment avec mon serveur web - J'ai récemment passé d'un service hébergé ASP.NET à un serveur virtuel dédié, donc je me fais une chance de jouer d'avoir un contrôle total sur mon serveur pour la première fois. J'ai passé un certain temps la mise en place l'exploitation forestière et des statistiques sur le serveur en utilisant la fonctionnalité IIS exploitation forestière et des 3ème partie logiciel de log-croquer. Ayant que les données de journalisation est précieux - entre autres choses, il m'aide à savoir quels gens pages sont intéressés et me donne un aperçu de savoir si il est trop difficile d'atteindre certaines parties de ma page. Avec l'ajout de contrôles de navigation dans le SDK de Silverlight bêta 3, ayant une solution de journalisation qui coopère avec mon serveur web semble prudent!
Tim Heuer a un grand poste de blog à partir de Décembre sur l'utilisation de suivi des événements avec Google Analytics pour les applications Silverlight . Mon impression est que cette approche fonctionne bien avec les nouvelles commandes de navigation, mais je cherchais une solution simple qui serait d'ajouter des entrées à mon IIS journaux directement depuis l'application Silverlight (sans avoir à ajouter de javascript ou d'utiliser le pont HTML).
La question qui se pose est que les contrôles de navigation utilise le fragment d'URI (texte après le signe "#" dans l'URL) pour déterminer quelle page pour naviguer dans un contrôle Frame. En conséquence (et à juste titre), liens profonds dans le Silverlight de contrôle ou de navigation qui se produit dans le contrôle Silverlight jamais aller-retour pour le serveur, donc il n'ya aucun moyen pour le serveur de se connecter à leur survenue.
Ainsi, mon approche est assez simple: faire une requête HTTP vers le serveur d'hébergement qu'il vous connecter en tout temps mon cadre est navigué.
Mes exigences pour l'expérience:
- Réutilisation intégré dans l'exploitation forestière caractéristiques de mon serveur web (IIS 7, mais j'imagine que cela pourrait fonctionner de façon plus générale)
- Veiller à ce que les URI unique dans ma demande sont enregistrés individuellement (chaînes afin de requête, les URI personnalisés, etc ne sont pas perdus dans les données enregistrées)
- Éviter de limiter la demande en exigeant le pont HTML pour être accessible ou nécessitant des fichiers supplémentaires à ajouter à mon site Web (tels que les fichiers JavaScript ou plus de pages ASP.NET)
Il s'avère que ce n'est pas si difficile à faire! J'ai commencé avec le projet d'application Silverlight Navigation modèle livré avec les outils Silverlight 3 Beta pour Visual Studio qui est sorti au MIX. Ce modèle de projet me met mis en place par un cadre, certains Pages, et quelques boutons qui causent le cadre de naviguer - tout ce dont une application de navigation du nouveau-né a besoin de devenir grands et forts!
J'ai commencé par la manipulation "navigué sur le contrôle Frame" événement dans MainPage.xaml:
: Frame x : Name ="Frame" Source ="/Views/HomePage.xaml" Navigation <: x Cadre: Nom = "Frame" Source = "/ Vues / HomePage.xaml" Navigated = "Frame_Navigated" HorizontalContentAlignment = "Stretch" VerticalContentAlignment = "Stretch" Rembourrage = "15,10,15,10" Contexte = "blanc" />
Avec la partie facile de la route (qui sait?), J'ai commencé à jouer avec WebRequest et WebClient jusqu'à ce que je suis venu avec quelque chose qui semblait répondre à mes besoins:
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 = new Uri (Application. Current.Host.Source.ToString () + "? nav =" + Uri. EscapeDataString (e.Uri.ToString ())); WebRequest wc = WebRequest. Créer (URI); wc.Method = "POST"; wc.BeginGetResponse ((res) => (WebResponse WR = wc.EndGetResponse (res);), this);)
Je vais marcher dans cette ligne par ligne et d'expliquer ma pensée:
Uri ( Application .Current.Host.Source.ToString() + "?nav=" + Uri .EscapeDataString(e.Uri.ToString())); Uri uri = new Uri (Application. Current.Host.Source.ToString () + "? Nav =" + Uri. EscapeDataString (e.Uri.ToString ()));
Ici, j'avais besoin de trouver un fichier que je savais être présent sur le serveur et qui n'est pas susceptible d'avoir une sémantique que je vais être prépondérant en faisant la demande. En outre, je voulais choisir un fichier qui identifier de manière unique l'application Silverlight qui fait la demande. Il semblait logique, puis d'utiliser le fichier XAP pour mon application Silverlight à cet effet! Ensuite, j'ai ajouté une chaîne de requête qui sera envoyée vers le serveur qui l'identifie de façon unique URI que le cadre est utilisé. Le résultat, si la source URI est "/ Vues / HomePage.xaml" (comme il est indiqué dans le XAML), l'URI résultante est la suivante: "http://yourservername.com/yourSilverlightApp.xap? nav =%% 2FViews 2FHomePage.xaml ". Ok, ok, ce n'est pas joli (Merci à l'encodage des URI), mais il fait le tour. La chaîne de requête ici jamais utilisée, mais il ne vous a envoyé vers le serveur et connecté, ce qui me laisse avec exactement les traces que je cherchais!
Suivant:
.Create(uri); WebRequest = WebRequest wc. Créer (URI); wc.Method = "POST";
Le repas important de ces deux lignes, c'est que j'ai utilisé la méthode HTTP POST. J'ai passé un tas de temps à essayer d'utiliser GET pour faire de l'exploitation forestière se produire, mais il a deux inconvénients essentiels:
- Toute demande serait re-télécharger le XAP, qui a été bien plus de données que je voulais juste pour obtenir le transfert de l'exploitation forestière va
- WebRequest et WebClient les deux utilisent le cache du navigateur (et je ne pouvais pas trouver une solution qui n'implique pas de modifier la chaîne de requête, ce qui aurait sabordé mon approche), alors répétez-visites à la même page de l'application Silverlight ne jamais réellement atteindre le serveur et d'obtenir connecté
Enfin:
wc.BeginGetResponse ((res) => ( WebResponse WR = wc.EndGetResponse (res); ), This);
Cette pousses juste à côté de la demande Web. Il n'y a rien de très spécial ici en dehors de noter que la réponse est totalement ignorée.
Et c'est tout!
Voici la preuve, tout droit de mon journaux IIS (en format W3C ... IP expurgée):
13/05/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 + + Center + 6,0 PC) - 405 1496
13/05/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
13/05/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 + + Center + 6,0 PC) - 405 1496
13/05/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 + + Center + 6,0 PC) - 405 1496
13/05/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 + + Center + 6,0 PC) - 405 1496
Et preuve de plus, de mon parti stats outil (3e ignorer les tailles de transfert à grande ... ils sont des objets de mon essai de la méthode GET, qui a transféré à quelques centaines de Ko à chaque demande):

Si vous êtes curieux de télécharger le code (ce n'est pas beaucoup plus que ce que vous avez déjà vu!), Vous pouvez le trouver ici: LoggedSilverlightNavigation.zip
Il ya certainement encore des progrès, bien. Une chose que je voudrais avoir de travail est finalement mise en en-tête Référence sur la requête HTTP à une valeur cohérente pour que je puisse vérifier comment les gens de page en page dans mon applications - mais cette est une bonne première étape.
J'espère que vous trouverez que utile! Si quelqu'un a d'autres suggestions / conseils / astuces pour la navigation, n'hésitez pas à me le faire savoir! Ce n'était que le résultat de mes expériences, alors si vous avez une meilleure façon, n'hésitez pas à commenter !
PS Toujours pas de réponses correctes à ma chasse aux oeufs de Pâques à partir de mon dernier post! N'abandonnez pas! Je vais poster la réponse plus tard cette semaine.
PPS Mark Monster dispose d'un poste de grande il ya quelques mois sur son blog sur le support du suivi Silverlight dans Google Analytics . J'imagine que vous pourriez utiliser une technique similaire pour accomplir le type d'exploitation forestière que je fais ici.
l'exploitation forestière , la navigation , Silverlight , Silverlight 3 Beta
Les messages récents
- Pour XAML, avec l'amour (une expérience avec XAML dans Silverlight sérialisation)
- Prenant Microsoft Silverlight 4 Applications delà du navigateur (TechEd WEB313)
- Navigation assurance-chômage et d'autorisation commune axée Sitemaps
- Les échantillons mis à jour et le code dans les commentaires
- Un "rafraîchissant" Authentification Autorisation expérience / 4 avec Silverlight
- Rendre plus facile l'impression de Silverlight 4
- Silverlight 4 Paru!
- Nouveautés dans le Silverlight 4 RC: XAML Fonctionnalités
Tags
. NET Services RIA activité de contrôle autorisation Blend BusyIndicator CollectionView ContentLoader contrôles liaison de données dynamiques de navigation Fun Konami Code exploitation MIX '10 navigation Off-Topic Out-of-browser PDC PDC09 personnels impression Projets Liens relatifs Server Silverlight Silverlight 3 Silverlight 3 Beta 4 Silverlight Silverlight 4 Beta Silverlight 4 RC Silverlight et au-delà (SLAB) Toolkit Silverlight Sitemap TechEd TechEd 2010 en Amérique du Nord Trusted Applications Validation Visual Studio 2010 Services RIA WCF XAML XamlSerializerTwitter: @ Depoll
- @ JeffHandley considérez-vous comme la mondialisation. ;) 13 août 2010 08:30
- rburger @ C'est un refrain incroyable - vaut jeter un oeil si elles sont à proximité 6 août 2010 04:54
- @ Rburger Ils ont été champions internationaux du temps après le temps (ils étaient bouleversés l'an dernier - la première fois en 30 ans, ils n'ont pas gagné) le 6 août 2010 04:53
Désistement
Le contenu de ce site représente mes propres opinions personnelles et les pensées au moment de l'annonce, et ne reflètent pas ceux de mon employeur en aucune façon.










