måndag 24 januari 2011

Login till Verktyg

Ett programfel i Login.aspx är rättat, men nu gäller det att disabla login i code behind om användaren redan är inloggad. Koden blir
If Inloggad Then
UserMess += "Du är redan inloggad. "
LoginButton.Enabled = False
End If
Men postens fält ChangeDate ändras inte. Det är nu åtgärdat. Dessutom lagras inte bara en unik identitet i cookien utan även användarnamn och lösenord, så att personer som använder samma dator hanteras åtskiljt.

söndag 23 januari 2011

Användarregistrering externt

Jag har sett över strukturen på sidan med användarregistreringen. Det som gäller att läsa cookie och ta reda på var sidan exekveras är lagda i subrutiner. Ev kan de sedan flyttas över till MasterPage.master.

Nu är uppgiften att anpassa den externa databasen till de ändringar jag gjort lokalt. Det går bra att lägga till nya fält (eller kolumner som de säger på SQL-språk) i tabellen Account men det är inte möjligt med SQL Server Management (SSM) ange att det nya fältet inte får vara tomt. Dumt!

Lösningen är nog att göra en Query som ändrar fältets egenskaper. Enligt MSDNs sida om detta verkar det som om frågan "ALTER TABLE Account ALTER COLUMN UserName NOT NULL" skulle lösa uppgiften. Men nej, det är syntaxfel. Testar det snarlika kommandot "ALTER TABLE Account ALTER COLUMN UserName NVARCHAR(20)". Och det funkar!

The Firebird FAQ säger att det helt enkelt inte är möjligt att ändra NULL-egenskapen hos en kolumn. Lösningen blir att skapa ett nytt fält och ta bort det gamla. Illa om tabellen inte är tom. Men att lägga in en ny kolumn med kommandot "ALTER TABLE Account add UserName2 nvarchar(50) NOT NULL;" funkar inte. Systemet säger: "ALTER TABLE only allows columns to be added that can contain nulls, or have a DEFAULT definition specified, or the column being added is an identity or timestamp column, or alternatively if none of the previous conditions are satisfied the table must be empty to allow addition of this column. Column 'UserName2' cannot be added to non-empty table 'Account' because it does not satisfy these conditions."

Men så prövar jag igen "ALTER TABLE Account ALTER Column UserName nvarchar(50) not null" och det fungerar. Snurrigt.

Fast kanske inte ändå. Först skapas fältet med "ALTER TABLE dbo.Account ADD GUID nvarchar(50)", Därefter läggs något värde i det nya fältet. Och sedan kan NOT NULL läggas till med "ALTER TABLE Account ALTER Column GUID nvarchar(50) not null".

Nu fungerar det att registrera sig som användare men det är också allt. Nästa steg blir att få Login att funka.

lördag 22 januari 2011

Externa webben igång

Den externa webben http://www.server42.seSpace2u är nu igång.

Jag har skapat den externa databasen med Microsoft SQL Server Management Studio Express 2008. Det var inte så komplicerat när jag väl kommit på servernamn, användarnamn, etc och dessutom registrerat mitt IP-nummer hos Space2u.

Den aktuella uppgiften är att göra inloggningen. Först ska programmet kolla var det exekveras så att ConnectionString ges rätt uppgifter. Sedan ska cookien läsas. Om användaren redan är inloggad så meddelas det.

Sedan visas inloggningsformuläret. Vid klick på "Logga in"-knappen skrivs en ny kaka. Nu gäller det att kolla indatauppgifterna. En metod är att använda Regular Expressions. En kurs på hos
regular-expressions.info.

En kontroll kan vara ruskigt komplicerad. Detta är Microsofts förslag till kontroll av epostadress: "^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$" Kravet på användarnamnet kan t.ex vara att det ska bestå av bokstäverna a-z och sifforna 0-9. Det ger uttrycket [0-9a-zA-Z] - inte så komplicerat. Sedan är det dags att skapa innehållet i cookien.

onsdag 19 januari 2011

Koppla samman med SQL Servern

Nu är webben i gång med det mest grundläggande, huvud, meny, några textsidor och ett formulär. Nästa steg blir att lagra formulärets text i databasen.

Först gäller det att skapa en förbindelse med databasen lokalt. Jag väljer <dator>/SQLEXPRESS, väljer Windows Authentication, döper filen till Tools och klickar på ok. Filen skapas med en gång. Skapar sedan en tabell med 7 fält: id, headline, text, owner, createdate, changedate och deletedate.

Sedan gäller det att kontrollera indata. En speciellt viktig uppgift är att förhindra att användare använder mindre än-tecknet vilket är en säkerhetsrisk. Standardreaktionen i ASP.NET är att avbryta med ett omfattande svårbergipligt meddelande. För att stänga av det så lägger jag dels in validateRequest="false" sidans Page-direktiv och dels lägger jag in kommandot httpRuntime requestValidationMode="2.0" i web-config. Därmed har jag tagit på ASP.NETs hantering.

Nu måste jag lägga in en egen kontroll som identifierar dessa tecken och skriver ut ett begripligt felmeddelande. Det gör jag med funktionen Server.HTMLencode som översätter "farliga" tecken till ofarliga kombinationer som gör att rätt tecken visas för användaren.

Jag vill lagra datum och tid i databasens fält CreateDate. Det hämtar jag med DateTime.Now(). Om jag ska skriva ut datum så använder jag DateTime.Now().ToString("d").

En klurighet är att jag råkade namnge tabellen för användareuppgifter till Users. Det fungerar inte. Man får inte skriva t.ex. "SELECT id FROM user" då users är ett nyckelord.

Jag lägger sedan in en användare direkt i databasen med Database Explorer och läser uppgiften utan problem. Skriver programraderna som uppdaterar tabellen Person med data hämtat från konstanter i programmet. Det fungerar efter att jag rättat en del småfel och övergått till att använda sqlCommand.parameters.

Jag har skapat en connectionsString för local och en connectionString för remote behandling. Programmet ser sedan var det är genom att det lokalt finns en speciell fil. Kan programmet öppna den kör det lokalt, annars kör det remote. Enkelt, men alla verkar inte ha kommit på denna lösning av frågorna på nätet att döma.

Och så har jag uppdaterat den externa webben. Databaskopplingen externt är inte etablerad, men lokalt fungerar det bra. Så nästa steg blir att skapa den externa databasen med SQL Server Management Studio.

måndag 17 januari 2011

Åter till Visual Web Developer

Efter försöken med WebMatrix står valet mellan att pröva om en begränsad del är kan fungera eller om jag ska återgå till  Visual Web Developer. I det första fallet får jag testa om det går att utveckla i aspx och ev använda sdf-databasen. I det andra fallet får jag använda VWD 2010 med sin rika Toolbox och SQL Express 2008?

Jag ger inte upp WebMatrix, men återgår tills vidare till VWD. Detta system publicerar jag på adressen http://www.server42.se/mno.

Det första lilla problemet blir att den nya default.aspx automatiskt får "~/MasterPage.master" som adress till masterpage. Eftersom systemet inte ligger i roten utan i mappen mno så får jag ändra adressen till  "~/mno/MasterPage.master" och då funkar det på den externa webben. Men inte lokalt. Det löser jag genom att flytta alla filer till en undermapp lokalt så mappstrukturen blir densamma lokalt och remote. Men det har medfört att systemet skapat en ny web.config i mappen mno samtidigt som den ursprungliga ligger i mappen mno/mon. Det är nog inte bra.

Jag försöker att använda class SiteMapDataSource för att visa en meny, men den kan inte hitta indatafilen web.sitemap. Dokumentationen av denna class är mycket omfattande, så jag ger upp och lägger i stället in menyalternativen som konstanter i MasterPage.master. Försöker ta bort SiteMapDataSource-koden med html-kommentar. Det fungerar inte. Den exekveras i alla fall, så jag tar bort den.

Nej, jag avstår ifrån försöket att lägga systemet i en undermap och startar om i huvudmappen. Först blir det Hello i en html-fil. Funkar.

Skapar en web.sitemap med innehållet i menyn, lägger till en css-fil och gör två ytterligare filer: Agreement.aspx och About.aspx. Sitemappen krånglar fortfarande. Menyn visas som en slags dropdown. Content hamnar också fel.

Menyn ändras genom tillägget av parametern ShowStartingNode="false". Det verkar dock som om css-filen helt enkelt inte läsas. Det berodde på felaktigt path till css-mappen. Så nu finns webben i en första mycket tidig verion (0.0003) på http://www.server42.se.

söndag 16 januari 2011

WebMatrix - flera applikationer på webben

Det är fortfarande oklart varför det ibland fungerar och ibland inte fungerar när jag laddar upp en webb från den lokala datorn till webbhotellet. Nu ska jag söka efter en förklaring och samtidigt se hur man har flera olika applikationer på den externa webben samtidigt.

Nu rensar jag den publika versionen på allt innehåll. Skapar lokalt webben abc och anger de vanliga parametrarna för överföring till Space2u, dock anger jag site path till public_html/abc. Skapar sedan en fil med htlm-mallen och behåller namnet HTMLPage.html. Lägger till texten Detta är abc. Kör lokalt och ser att det fungerar.

Klickar på Publish och får det vanliga felmeddelandet. ASP.NET version är Unknown och Simple HTML page är Not Available. Dessa meddelanden förklaras på Microsoft WebMatrix: Publish Compatibility, men det verkar som om de inte är väsentliga. Så jag klickar Continue och två filer förs över: robots.txt och HTMLPage.html. Checkar med FileZilla att filerna kommit fram. Det är viktigt att välja Server, Tvinga fram visning av dolda filer för annar syns itne filerna på den externa webben. Filerna syns också i webbläsaren på adressen http://www.server42.se/abc/HTMLPage.html. Så långt ser allt bra ut.

Nu skapar jag en ny webb på samma sätt, men med namnet xyz. Inga problem - i vart fall så länge det gäller vanliga html-sidor. Nästa steg blir att lägga upp en aspx-sida i xyz-mappen. Döper filen till ASPXVB.aspx då denna mall förväntar VB-kod. Och publicerar den. Det fungerar inte alls: 404 - File or directory not found.

Och det är inte så konstigt. Aspx-filer kräver minst en web.config-fil. Skapar en ny fil med mallen web.config (4.0). Och då fungerar det: http://www.server42.se/xyz/aspxvb.aspx.

Nästa steg är att skapa en ny webb med en mall som inte är tom. Jag väljer Starter Site för den innehåller databasaccesser. Det är frestande att bara kopiera denna malls sidor innehållet i xyz, men det får anstå till en senare test.

Mallen innehåller också en ny filtyp: _siteLayout.cshtml. Måste läsa på om den. Dessutom används den nya symbolen @ som föregår Razor-satser. Funktionerna är bl.a. registrering, login, logout, ändra epostadress mm. Kör igenom funktionerna lokalt och allt ser ut att fungera. Publicerar så hela systemet till Space2u bestående av 43 filer och en sdf-databas.

När jag väljer http://www.server42.se/def/ så borde default-sidan visa sig, men  i stället visas 403 - Forbidden: Access is denied. Det beror troligen på att Default.cshtml inte godtas som defaultsida. Hur ändrar man på det? En möjlighet är kanske att skapa en sida som uppfattas som default och som sedan gör en redirect till Default.cshtml.

Men när jag anger adressen http://www.server42.se/def/Default.cshtml så kommer meddelandet
Server Error in '/' Application.
This type of page is not served.Description: The type of page you have requested is not served because it has been explicitly forbidden. The extension '.cshtml' may be incorrect. Please review the URL below and make sure that it is spelled correctly.
Och det ser ju ut att vara svårt att komma runt. Tyvärr är alla mallar gjorda för cshtml. Det blir ett brev till Space2u och sedan paus i WebMatrix-projektet.

lördag 15 januari 2011

WebMatris ominstallation

I ett försök att hantera problemen med WebMatrix har jag avinstallerat systemet och sedan installerat det igen. Jag är inte säker på att allt blev avinstallerat, men systemet är nu igång igen. Jag ser att IIS 7 installerats tillsammans med WebMatrix.

Sedan har jag startat en ny lokal webb med namnet WebSite1. Publiceringsparametrarna ligger kvar sedan tidigare installation (allt togs alltså inte bort).

Det första man ska göra verkar vara att registrera ett lösenord. Lösenordet sparas i filen _Password.config. Instruktionerna säger att jag sedan ska ta bort det inledande tecknet "_". Och det kan jag väl gå med på.

Med hjälp av lösenordet kan jag logga in till administrationsdelen. Där finns det väldigt många tillägg att installera, men det avstår jag ifrån nu då jag bara vill se om jag kan få det att fungera. Så jag loggar ut.

Nästa steg är att ange parametrarna till den externa webben.  Då Web Deploy inte fungerar så väljer jag FTP.

Sedan kollar jag listan över webbhotell som erbjuder. Det finns ett svenskt hotell:  GNS.SE som tar 49,50 per månad. Engelska företag tar ca 20 SEK.

Publicerar sedan den nyskapade webbens filer, men det blir bara två nya password-filer som publiceras. Tydligen minns WebMatrix fortfarande vilka filer jag publicerat tidigare, trots att hela systemet är ominstallerat. Jag får skapa en ny lokal webb.

Denna gång väljer jag mallen Starter Site. Registrerar FPT-parametrarna, och klickar på publish. Kompatibilitetschecken varnar för fel ASP.NET version remote med kör vidare ändå. Markerar att databasen Databases.sdf ska överföras. WebMatrix rapporterar Publishing - Complete, men till webben kommer inte något.

Fast i det har jag fel. Anledning till att inget syns är att FileZilla inte visar dolda filer och allt som förs över är dolt. Varför? Så nu är allt på plats, men ändå visar webbläsaren ingenting.

Gör en Hello World-fil och publicerar den. Den visas! Men about.cshtml ger Server Error in '/' Application. Jag får ändra web.config, så att felorsaken visas i webbläsaren. Men det fungerar inte.

Prövar så att skapa en en ny tom webbsite. Det enda den innehåller från början är filen robots.txt som innehåller "# WebMatrix 1.0" - det är allt. Väljer New för att skapa en ny sida och väljer mallen aspx. Skapar också en ny fil med mallen Web.config (4.0). Skriver Hello World, kopierar den över till webbhotellet - och det fungerar!!! De enda filerna på den externa webben är dessa tre: robots.txt, web.config och Webforms.aspx.

Stimulerad av framgången skapar jag en ny fil med mallen vbhtml och publicerar den. Denna gång överförs en rad andra filer:
Och se, programmet kör!!!

Pröver med att mallen cshtml på samma sätt. Fungerar. Känner en svag luft under vingarna.

fredag 14 januari 2011

Har just köpt en ny stor liten disk

Denna gång valde jag att köpa en Western Digital Essential på 1 TG med USB 3.0. Den fungerar bara genom att sätta in sladden i datorn. Så ska det vara. Manual finns på nätet och på disken.

Nu ska jag testa WD SmartWare för automatisk selektiv backup. Först gick den igång helt perfekt, men sedan jag var tvungen av att avbryta den har jag inte lyckats återstarta den. Så nu blir det manualstudier igen.

WebMatrix är released

Nu blir det spännande. Den lovande produkten Webmatrix från Microsoft har just lanserats. Den ska som all annan programvara från Microsoft vara "enkel".

Och på en punkt har MS redan uppfyllt detta krav. I stället för att döpa sin nya produkt till Microsoft Windows WebMatrix Studio Professionel . så heter den rätt och slätt WebMatrix.

Installation av ny programvara är alltid spännande. Denna gång är det lite extra för jag har redan använt en Beta. Den ligger kvar då jag inte inte hittar någon uninstall och programmet inte heller finns med vid sökning via kontrollpanlen.

Installationen gick bra

Planen nu är att göra minst möjliga program och publicera det till webben. Ser att hjälpen inte fungerar. Den består bara av en söksida

När man startat en applikation visas en sida med bl.a. texten
Men klickar man på den så kommer meddelandet
Site Error
An error was encountered while publishing this resource.
Resource not foundSorry, the requested resource does not exist.
Check the URL and try again.
Det här börjar inte bra...

Sedan gäller det att ange parametrarna till WebDeploy som svarar för överföringen till www.server42.se. Men det gick inte
Anledningen är nog att webbhotellet Space2u inte har installerat detta system hos sig (Eller är det jag som ska göra det? Hur i så fall?), Men det ska gå nästan lika bra med FTP. Den inbyggda testen säger också att det gick att etablera kontakt med webbhotellet med de valda parametrarna.

Skriver sedan det traditionella Hello World-sida. Och får felmeddelandet "The specfied port is in use". Vid klick på Details kommer felmeddelandet och det med en positiv innovation. Nu äntligen går det att kopiera meddelandet till klippbordet.  Det är något jag väntat på länge. Här är meddelandet:
The specified port is in use
Port '8080' is already being used by process 'python.exe' (process ID '5884').
Recommendations:
1. Try switching to port other than '8080' and higher than 1024.
2. Stop the application that is using port '8080'
Jag har Python installerat, men har nog aldrig använt det. Så det tar jag av avinstallerar och hoppas därmed frigöra den önskade porten. Jo, jag kunde göra det direkt men den dag jag sedan använder Python så vet jag inte hur det programmet reagerar.

Hmm, det kanske inte var så klokt ändå. Ser nu att Dropbox använder Python. Möjligen också Google Apps.

Med Python borta återstår problemet när jag kör Hello World. Tillbaka till Windows brandvägg via kontrollpanel. Klickar på Lägg till program. Hittar Microsoft WebMatrix och lägger till programmet. Samma fel igen! Avslutar WebMatrix och startar igen. Samma fel. Porten 8080 används fortfarande av Python.

Pythonw finns med i listan över program som använder portar, men programmet har inte fått rätt att använda någon port. Tar bort det från listan och lägger till porten 1025 med protokollet TCP. Samma fel.

Går till Brandväggen avancerad säkerhet. Tar tid innan sidan visar sig. Rapport om "snap-modulen inte svarar"! Ger upp att pröva denna väg. Livet med Microsoft känns igen.

Felmeddelandet säger något om processen 5884. Går till Aktivitetshanteraren, lägger till kolumnen PID och konstaterar att någon process med detta nummer finns det inte. Men väljer så att titta på processer för !alla användare; trots att det är bara jag som använder maskinen. Och då dyker processen upp. Avslutar processen. Och nu kommer programmet igång. The following site has started successfully: 'WebSite1'.vMen var syns sidan??????

Anledningen att inget syns var att jag inte valt någon webbläsare. Ett litet meddelande om det har inte varit i vägen. Men äntligen syns Hello World.

Nästa steg är att ftpa denna viktiga text till webben. Vi första försöket meddelar WebMatrix

Publish CompatibilityWebMatrix will upload a few files to iis5.space2u.com to test compatibility with the site. These files will be automatically deleted after the test. Click Yes to proceed, or No to skip the test.
Jag väljer givetvis Yes. Resultat gick inte att kopiera till klippbordet och innehållet var inte kul det heller:
Dessutom finns valmöjligheten Continue och den tar jag. En förteckning över WebMatrix lokala filer visas. Klickar på Continue igen. Nu rullar publiceringsmeddelandena och det avslutas med Publishing - Complete.

Men tyvärr. De publicerade sidorna syns inte på webben....

Ett snabbt besök på webben med FileZilla visar att anledning är att de publicerade sidorna lagts direkt i rotbiblioteket "/" och inte i mappen Public_html, som i vart fall Space2u kräver.

Tömmer så webben på allt innehåll och publicerar igen. Ingen sidan visas. Publicerar Hello World. Inget resultat. Tömmer webben. Ändrar Hello World så att den kan publiceras. Och så syns den på webben!!! Men nu vägrar WebMatrix att kopiera över standardfilerna som jag just tagit bort på webben, för de har inte ändrats lokalt.

Ser ett nytt meddelande när jag klickar på varningen ASP.NET version som jag nämnde ovan. Det är ett ovanligt idiotiskt meddelande. Det går inte att kopiera till klippboken och så fort jag klickar  på skärmklippverktyget så stängs meddelandet. Men via PrintScreen och klistra in i Word så går det.

Det går inte på räls att få igång WebMatrix







torsdag 13 januari 2011

Förbindelse med databasen

Det är lite klurigt att komma underfund med hur programmet ska komma i kontakt med databasen. När databasens namn xyz.mdf inkl dess mappstruktur anges som connectionstring, dvs C:\Users\HIB\Documents\Visual Studio 2010\WebSites\xyzz\App_Data\xyz.mdf så fungerar det lokalt. Men när databasen kopierats över till webbhotellet så är dess adress en annan.

Det finns en intressant webb, Connectionstrings.com, som visar hur komplicerat det är med connections till databaser. Mitt problem kommenteras dock inte. Stackoverflow har en annan beskrivning.

onsdag 12 januari 2011

Nytt Projekt: xyz

Har skapat webben xyz lokalt och kopierat över en html-sida och en aspz-sida med code behind. Inga problem.

MSDN har en riktigt trevlig beskrivning av hur man gör en HTML-sida. Hur man gör en aspx-sidan beskrivs här.

Men den MasterPage som jag lagt till visar sig inte. Felet berodde på att jag lagt texten som ska visas inom ContentPlaceHolder och ett sidhuvud ska placeras ovanför. MSDNs beskrivning av hur man gör en MasterPage är också riktigt bra.

Nästa steg är att skapa en databas dels lokalt och dels på webben. Lokalt klickar jag på Tools, Connect to Database, anger namnet på den nya databasen och låter alternativet Windows Authentication vara kvar så jag slipper inloggningsproblemen. Klickar på ok och då skapas databasen. Testmöjligheten är inte aktuell. Det finns ju inget att testa.

I Database Explorer öppnar jag databasens mappstruktur, högerklickar på Tables och väljer Add New Table. I tabellen lägger jag in två fält Id och Email och sparat tabellen med namnet User. Jag passar också på att lägga in en epostadress.

Innan jag går vidare med att skapa tabeller vill jag veta om och i så fall hur databasen kan överföras till webben. Sedan blir det vanliga att kopiera webben till den lokala installationen.

Jag tycker mig ha sett att hanteringen av databaser fungerar på ett nytt sätt i Framework 4 som jag använder, så det gäller att hitta en beskrivning. ASP.NET Data Access verkar vara ett bra ställe att börja läsa på.

Noterar nu att databasen hamnat helt galet i Windows mappstruktur. Den rätta platsen är i mappen App_Data i Web Site-mappen. Jag flyttar den därför till rätt mapp och uppdaterar adressen i properties.

Nästa steg är att visa epostadressen jag registrerade lokalt. Det är enkelt med Gridview. Det är bara att dra den från ToolBox och sedan komplettera med sqldatasource från samma ToolBox som kompleteras med adressen till sql-filen.

ASP.NET har speciella funktioner för hantering av medlemmar, dvs egentligen registrering av användare inloggning, mm.

Skapa ny webb med Visual Web Developer 2010

En anledning till att det inte fungerade att publicera sidor på webben www.server42.se var att "4.0 har en egen applikationspool", som dock nu Space2u snabbt fixat. Men det fungerar ändå inte...

Därför tänker jag att skapa en ny webb med minsta möjliga storlek lokalt och sedan ftpa den webben. När man skapar en webb med Visual Web Developer 2010 (VWD10), ska man välja mellan Project och Web site. Skillnaden beskriv på MSDN på sidan Visual Studio Templates for Web Projects:
  • Use the Web application project template to create Web applications that are compiled into an assembly and that provide rich options for deployment.
  • Use the Web Site projecttemplate when you want the source code to be compiled dynamically.
Inte särskilt klargörande. Ämnen fördjupas på sidan Web Application Projects versus Web Site Projects. Tydligen har jag valt fel typ hittills. Jag har chansat på Project, men Web Site har bl.a. följande egenskaper:
  • använda både c# och vb
  • kunna uppdatera enskilda filer med ftp
  • kräver inte kompilering
  • källkoden finns på webben, bl.a. bra som kopia
Det ska vara besvärligt att konvertera en Web site till ett Project, men det går.

Nästa steg är att välja mall (template). Två alternativ låter tänkbara: ASP.NET Web Site och ASP.NET Empty Web Site. Skillnaden beskrivs under rubriken Web Site Templates. Denna gång vill jag ha med lite automatisk kod från början som jag kan ftpa till webben direkt för att se om det fungerar.

Och det gör det! Gör i liten ändring i en sida, kopierar den till webben och det fungerar också. Nu kan jag ta bort denna webb och starta en på riktigt.


tisdag 11 januari 2011

Hur publicerar jag webben?

Jag har börjat fundera över hur jag publicerar webben när det finns något som vänner kan titta på. Jag har kopierat filer skapade med Visual Studio 2010 till Space2U, men det fungerar inte alls. Däremot fungerar det direkt om jag kopierar filer som skapats med VS 2008. Varför? Vad har ändrats?

Felmeddelandet lyder: It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.

Det verkar vara nödvändigt att läsa på hur publiceringen (eng deployment) går till. Väldigt många av MS artiklar gäller tidigare versioner av VS och de gäller inte längre då det verkar gjorts stora ändringar i senaste releasen.

En av MS utvecklare beskriver ändringar på sin blogg.

onsdag 5 januari 2011

Hur funkar IndexOfAny(Char[])?

Jag vill se till att användare inte skriver tecknet "<" i indata. Hur gör man det i C#? Min första tanke var
men det ger felet "No overload för method 'IndexOfAny' takes 0 argument."

Vad betyder det? Och hur ska man göra i stället?

Under letandet efter svar hittar jag några webbar som verkar bra:
csharpskolan.se
Using Regular Expressions with The Microsoft .NET Framework

Så jag prövar denna metod i stället för IndexOfAny.

När jag testar koden med ett mindre än tecken i rubriken kommer meddelandet A potentially dangerous Request.Form value was detected from the client.... För att ge användaren ett begripligt besked måste koppla bort denna funktion och ersätta den med en egen.

Det gör man genom att lägga in httpRuntime requestValidationMode="2.0" i httpRuntime configuration. Närmare förklaring ska finnas på sidan Request Validation - Preventing Script Attacks. Följer instruktionerna men det funkar ändå inte.

Så plötsligt hittar jag en smart sida som hjälper en att publicera kod i bloggar. Riktigt smart. Här är den aktuella koden:
Headline.Text = Headline.Text.Trim(); //Ta bort leading och trailing blanks
Regex regex = new Regex("<", RegexOptions.IgnoreCase); //Anger sökt tecken
MatchCollection matches = regex.Matches(Headline.Text); //Söker, ger antal träffar
if (matches.Count > 0) {
  Message.Text += "Tecknet < får inte användas i rubriken. ";
  Error = 1;
}

Varför funkar inte spärren mot Request Validation? Beskrivningen säger att den gäller  ASP.NET 1.1 and ASP.NET 2.0. Kan det vara orsaken? I meddelandet står det

To allow pages to override application request validation settings, set the requestValidationMode attribute in the httpRuntime configuration section to requestValidationMode="2.0". Example: <httpRuntime requestValidationMode="2.0" />.


Var finns "httpRuntime configuration section"? Här är MSDNs beskrivning.

Det är inte bara jag som har detta problem visar det sig. Lösningen kom på plats efter att jag läst dotnetguts. Så här ska det aktuella avsnittet i Web.Config se ut:

  <system.web>
    <httpRuntime requestValidationMode="2.0" />
    <pages validateRequest="false" />


Nästa uppgift blir att kolla om det finns andra otillåtna tecken i rubriken.

söndag 2 januari 2011

Grunderna i C#

Efter att ha hållit på med att formatera ett sqlfält av typen datetime med hjälp av C# inser jag att jag behöver med grundläggande kunskap om språket.

Microsoft har en programguide för C# modell Visual Studio 2010. I dess inledning hänvisar de noviser till Visual C# Developer Center och det är nog där jag börjar.

Nästa uppgift blir att ta hand om indata från ett formulär som består av Headline och en sidtext. Rubriken får inte vara tom och det ska kontrolleras i programmet. Det gäller alltså att se till att det finns synliga tecken i rubrikfältet. Sidtexten får inte innehålla "<".

MSDN har en guide om strängar i c#  och en beskrivning av String Class. Jag börjar att söka runt i den senare först.

Lösningen bör vara att loopa igenom rubrikfältet till dess att ett alfranumeriskt tecken upptäcks. Jag prövar med att modifiera en kodsnutt från avsnittet Strings and Indexes
Boolean ok = false;
Headline.Text = Headline.Text.Trim(); //Ta bort inledande och avslutande blanka
for (int ctr = 0; ctr < Headline.Text.Length; ctr++) {
if ((rubrik[ctr]>char(47) and rubrik[ctr]<char(58)) or (rubrik[ctr]>char(64) and rubrik[ctr]<char(90)) or (rubrik[ctr]>char(96) and rubrik[ctr]<char(123))) {ok=true;}
 }
if (ok == true) {
message.text="Texten har sparats.";
} else {
message.text="Texten sparades inte.";
}

(Tråkigt att det är så svårt att publicera kod i Blogger....)

Fast det borde vara en while-loop. Finns det någon funktion som direkt avgör om ett tecken är alfanumeriskt? Och dessutom hanteras inte åäö. Men jag prövar lösningen i alla fall.

Kanske bör jag använda IndexOfAny(Char[])?

lördag 1 januari 2011

Webbläsaren Opera ger goda vibrationer

För en tid sedan installerade jag Opera på telefonen men tyckte inte den var så intressant. Nu har jag gjort om installationen och tänkt om. Fullständigt. Den verkar vara en mycket bra webbläsare på mobilen och dessutom är den för datorn riktigt, riktigt, bra.

Den är så rik på funktioner så det kommer att ta tid innan jag kommer på allt jag kan vilja använda. En viktig funktion är dock igång och det är Opera Link som synkroniserar min bokmärken mellan telefonen och datorerna.

Projekt: xyz, del 2

Läget är att systemet XYZ har en tabell med namnet Page och tre sidor. Sidorna består av en MasterPage och sidorna Hem och Om som fanns med när webben initierades och så sidan Page2 som hämtar en post från databasen och visar den på sidan.

Planerade steg:
- Formatera datum. Skrivs nu 2010-12-31 00:00:00 men jag vill inte ha med tiden
- Göra en text klickbar. I listan över sidor ska man kunna klicka på rubriken varefter systemet visar sidan.
- Snygga till tabellen med CSS
- Skapa sida för registrering av sida, RegPage

Enligt csharp-examples ska datum kunna formateras om med String.Format("{0:y yy yyy yyyy}", dt);, där dt är en uppgift med formatet datetime, hämtad med reader, t.ex. reader["CreateDate"]. Och det fungerar, men hänsyn har inte tagits till olika kulturers sätt att formatera datum och tid. Microsoft har en mer avancerad lösning om hanterar det.

Då en länk ska skrivas <a href="sidans adress">klickabara texten</a> blir det problem om länken ska ingå i en sträng som ju omges av "-tecken. Det går inte att skriva t.ex.
"<td><a href="" + sidadress + "">"+ länk + </a</td>;

För att lösa problemet skapar jag en konstant Char Cit = (char)34; och skriver uttrycket
"<td><a href=" + cit + sidadress + cit + ">"+ länk + "</a</td>;

Det finns oändligt många sidor om CSS på nätet. Google säger 290.000.000 sidor. Först rankar Google helt rätt W3Schools och W3Cs sida om CSS. W3Cs sida som validerar CSS-koden är också viktig.