Bygga Splashes med C# ASP.NET
Förord
Detta är en enkel guide avsedd att visa lite teknik för hur du hämtar en HTML response och sedan adderar det på din hemsida. För att göra detta så skall vi bygga en liten klass som levererar HTTP klasser från frameworket.Innehåll
»»
»
Vad är en splash?
Rent praktiskt är det ett flexibelt sätt att ändra innehållet i en ny box. Att ha statisk text och bild från databasen som presenteras kan kännas enkelt och tråkigt så vi vill göra innehållet lite mer flexibelt. Därför vill vi få en .aspx sida att köras inuti en box. För att kunna göra detta och kontrollera vårt innehåll så måste vi köra en rutin. Jag har byggt en klass som använder System.Net namespacet och några ytterligare HTTP-klasser. Rent generellt så skapas ett nytt HTTP anrop till sidan och hämtar svaret som i sin tur returneras som en sträng.
Nog om detta, låt oss titta på lite programmering nu. Systemets System.Net namespace ger en programmerare det verktyg som behövs för att programmatiskt skapa en fråga för en HTTP pipe. Syntaxen är enkel och skrivs som:
WebRequest puffRequest = HttpWebRequest.Create(“http://www.cshrp.net/somefolder/somepuff.aspx”);
Detta anrop tar ett argument, dess URI som pekar på någon sida på internet. Eftersom den tar en URI och inte en URL så måste vi även specificera vilket protokoll som skall användas för frågan, i detta fall HTTP eftersom vi pratar med en webbserver.
Ovanstående kod kommer skapa en fråga men har inte kört den än. För att göra det så måste vi arbeta asynkront och utföra körningen. Men i detta exempel vill jag istället få en kontroll istället för multitasking så vi utför istället anropen och väntar på svaret:
WebResponse puffResponse = puffRequest.GetResponse();
Detta initialiserar frågan, skickar motsvarande HTTP huvud till webbservern för att informera vad du vill få i retur. När webbservern får förfrågan så delegeras arbetet till avsedd HTTP hanterare beroende på vilken filextension som efterfrågas, i vårat fall en .aspx-fil. Nu startar asp.net motorn upp och bearbetar förfrågan som i sin tur skickar tillbaks anropet som fyller piffResponse-objektet.
Nu har webbservern svarat på vårt anrop. Nu skall vi försöka göra någonting med detta och som jag nämnde tidigare, så vill vi skapa en sträng som innehåller detta huvud och kan sedan använda det vart vi vill på vår sida. För att göra detta så måste vi ladda huvudet in till ett stream objekt och läsa denna ström till en sträng. Vi kommer använda en klass från System.IO namespacet som heter StreamReader. När vi skapar ett StreamReader objekt så tar konstruktorn ett Stream objekt som argument.
StreamReader puffStream = new System.IO.StreamReader(puffResponse.GetResponseStream());
Som du ser av detta exempel så implementerar klassen en metod som kallas GetResponseStrem som returnerar ett streamat objekt innehållande HTTP huvudet. Nu när vi fått huvudet uppladdat i StreamReader så kan vi enkelt översätta detta och lägga in det i en sträng:
Exempelkod
För att få detta att fungera med en codebehind dll så måste dllen finnas i applikationens BIN katalog. Jag har inte kommit på hur man i web.configs probe tag för att få tag på rätt virtuell katalog (troligen fungerar localpath, men om man kör på webbhotell så är inte det så flexibelt som man skulle önska).
string HTML = puffStream.ReadToEnd();
Runt denna teknik har en lite mer komplex klass byggts in som slumpmässigt tar en fil från den specificerade
katalogen och skickar tillbaks den som html.
using System;
using System.IO;
using System.Net;
using System.Web;
public class Content
{
///
/// Hämtar HTTP Body för en .aspx sida i puff-katalogen
///
/// relativ sökväg för katalog innehållande puffar
/// URI för katalog innehållande puffar
/// Hämtar body innehållet
/// Returnerar fel om frågan inte lyckades
/// Content puffContent = new Content();
/// string HTML = "";
/// string status =
/// puffContent.GetPuffHTML(Server.MapPath("/puffs/"),
/// "http://www.cshrp.net/puffs/", out HTML);
/// // En div tag med runat=server
/// puff.InnerHtml = (HTML!=""?HTML:status);
///
public string GetPuffHTML(string puffDirPath, string URI, out string HTML)
{
string error = "";
//Hämtar vald katalog
DirectoryInfo puffDir = new DirectoryInfo(puffDirPath);
if(!puffDir.Exists) { throw new Exception("Puff path not found!"); }
//Fyller en array med alla filer i aktuell katalog
FileInfo[] puffs = puffDir.GetFiles("*.aspx");
try
{
//Ger en referens till aktiv asp.net
//application som kör methoden.
HttpApplication currentApp =
HttpContext.Current.ApplicationInstance;
// Vi använder Applikationsvariabeln för att
// minnas vilken som sist användes. Vi vill
// ju inte se samma två gånger.
object puffIndex = currentApp.Application["puffIndex"];
int oldIndex = -1;
if(puffIndex!=null)
{
oldIndex = (int)puffIndex;
}
if(puffs.Length > 0)
{
System.Random rnd =
new System.Random(int.Parse(
System.DateTime.Now.Second.ToString()));
int index = 0;
do
{
index = rnd.Next(puffs.Length);
}while(index==oldIndex && puffs.Length>1);
currentApp.Application["puffIndex"] = index;
// Skapar ett anrop med filnamn till slumpat index.
WebRequest puffRequest =
HttpWebRequest.Create(URI + puffs[index].Name);
WebResponse puffResponse = puffRequest.GetResponse();
StreamReader puffStream =
new System.IO.StreamReader(
puffResponse.GetResponseStream());
HTML = puffStream.ReadToEnd();
puffStream.Close();
puffResponse = null;
puffRequest = null;
puffStream = null;
}
else
{
HTML = "";
}
}
catch(Exception ex)
{
error = ex.Message;
HTML = "";
}
return error;
}
}
Björn Johansson
Tycker det är svårt att läsa koden här...:( du skulle inte kunna fixa det mer läsbart?