Material till Loopias kunskapsdatabas - om mappen App_Data

Idag flyttade Loopia en sida mellan två servrar som jag har utvecklat. Det gick ganska bra och Loopias support var till och med inne och ändrade absoluta sökvägarna inne i Web.config så att den matchade den nya filstrukturen.

I sluten av deras mail kom dock följande mening: "Access-databasen bör ni spara utanför public_html av säkerhetsskäl"

Grejen är bara den att det kom jag fram till själv att det inte fungerar i medium-trust miljö, redan i juli 2006. Hade då följande emaildiskussion med supporten. Ordningen på meddelandena är omvänd så börja läsa längst ner.

Kanske dags att lägga in det där stycket i kunskapsdatabasen nu ;)

Loopia:

Ja, det är en bra lösning och vi ska se till att lägga upp den i vår kunskapsdatabas.

Jag:

Tack för svaret. Kom på att man kan skapa en App_Data i .NET 2.0 som automatiskt blir privat.

Så /data mappen bredvid public_html är i stort sätt överflödig i och med övergången till 2.0. Man kan lika gärna ha databaser och alla privata filer i App_Data om jag har förstått det rätt.

Så det kanske ni kan tipsa era kunder om ifall någon mer frågar om samma sak.

Loopia:

Precis som det står på http://support.loopia.se/kb234 så tillåts inte filaccess utanför applikations-mappen (public_html) i och med lanseringen av .NET 2.0 Framework då Trust level är satt till "Medium trust". Undantag är databasfiler som används med t ex OleDb/ODBC som kan placeras utanför applikations-mappen.

De alternativ som finns är alltså att flytta filerna till public_html-mappen eller att använda en databas (Access) för att spar informationen i.

Återkom gärna om du har några frågor eller funderingar.

Jag:

Hej

Jag ser att ni har uppgraderat era servrar till 2.0 idag vilket är mycket uppskattat.

Nu märker jag dock att det inte går att komma läsa/skriva filer med hjälp av DirectoryInfo klassen.

DirectoryInfo di = new DirectoryInfo("h:\home\users\...");

Jag har last eran kunskapsdatabas och även länken till Microsoft som ni angett. Har provat en hel del grejer bland annat med MapPathSecure, PhysicalApplicationPath etc utan någon lycka. Jag vill kunna komma åt filer i en mapp som ligger i "data/" mappen utanför public-html.

Har ni några tips?

By Jesper Lind

Klipp av för långa texter på smart sätt

Hittade en smidig funktion hos Ted Nyberg som klipper av texter på ett bra sätt. Hacket kommer aldrig i mitten av ett ord och ifall det är mitt i en mening läggs tre punkter till.

Hoppas att det är lugnt att jag återpublicerar koden här också.

public static string TruncateText(string OriginalText, 
    int MaxCharacters)
{
   string stopChars = " .!?";

   if (OriginalText.Length > MaxCharacters)
   { 
      string stringToReturn = OriginalText.Substring(0, MaxCharacters); 

      while (!stopChars.Contains(stringToReturn.Substring
         (stringToReturn.Length-1)) && stringToReturn.Length>0)
      { 
         stringToReturn = stringToReturn.Substring(0, 
            stringToReturn.Length - 1);
      } 

      if (stringToReturn.Length == 0)
         stringToReturn = OriginalText.Substring(MaxCharacters);

      stringToReturn = stringToReturn.Trim(); 
     
      if(!stopChars.Contains(stringToReturn.Substring
         (stringToReturn.Length-1))) 
      { 
         stringToReturn += "..."; 
      } 

      return stringToReturn; 
   } 
   else 
   { 
      return OriginalText; 
   }
}

By Jesper Lind

Texteditor i ASP.NET AJAX släpps på CodePlex

Kannan Sundarajan har skapat en "Rich Text Editor"-kontroll med ASP.NET AJAX och delat ut den med en MS-PL licens på CodePlex. Läs mer hos Kirti's blog för skärmskott och kolla in ett demo.

Ser ut att vara en någorlunda start. Men att det blir radbryt vid entertryckning istället för paragraf, att den inte stödjer XHTML och att den använder FONT-taggar tycker inte jag är så bra.

Förhoppningsvis utvecklas den fint av communityn så det är nog något att hålla ögonen på.

By Jesper Lind

SubSonics skapare anställs av Microsoft

Rob Conery, skaparen av det automagiska databaslagret SubSonic, tackar ja till en anställning av Microsoft och kommer börja redan om några veckor.

Här på Code Odyssey har vi börjat använda SubSonic i våra projekt och det är verkligen en fantastisk hjälp när man jobbar med SQL-Server. Men eftersom verktyget är öppen källkod och inte har varit sammanknutet med Microsoft så har vi varit lite nervösa inför framtiden.

Vi har funderat på hur det kommer se ut när LINQ är redo att använda. Kommer det vara ännu bättre än SubSonic, och kommer vi då lockas att byta DAL-lösning en gång till. Har vi satsat på rätt teknik och hur framtidssäker är den?

Men med skaparen på plats i Redmond känns det inte osäkert längre. Rob kommer få i uppgift att bygga ihop SubSonic med det nya MVC-ramverket som är under utveckling. Själva SubSonic kommer även fortsättningsvis vara öppen källkod under MPL 1.1-licens.

Om du inte har hört något om Microsofts planerade Model-view-controller (MVC) arkiterktur, så rekommenderar jag läsa hos Scott Guttrie och Scott Hanselman. Hos den senare finns video-presentationerna från ALT.NET-konferensen i Austin där MVC-ramverket presenterades publikt för första gången.

By Jesper Lind

Så fixar man AJAX-felet 'Sys' is undefined på IE6

Om man kör ASP.NET AJAX på en sajt kan man få javascript-felet 'Sys' is undefined. Detta beror på att IE6 har problem med en komponent för att ladda de komprimerade skripten.

Problemet sägs vara lagat i senare släpp av AJAX-ramverket men jag fick felet nyligen (på Loopias webbhotell). Om detta uppstår kan man helt enkelt stänga av komprimeringen helt som jag läste här. Detta görs genom att lägga till följande i Web.Config.

<system.web.extensions>
<scripting>
<scriptResourceHandler enableCompression="false" enableCaching="true" />
</scripting>
</system.web.extensions>

By Jesper Lind

Om SessionID ändras vid varje request

Det här gör jag fel på cirka en gång per år, så dags att spara till det lite mer permanenta blogg-minnet.

Om du använder SessionID i ASP.NET, tänkt på att det skapas ett nytt vid varje request, så länge du inte har sparat något annat värde. Så tror jag inte det fungerade med klassisk ASP så det är lätt att göra fel.

För att få samma SessionID vid varje omladdning får man alltså gör något liknande detta.

if (Session["MySessionSaver"] == null)
Session["MySessionSaver"] = "1";

lbl.Text = Session.SessionID;

Skyll alltså inte på att webbhotellet har fel på sina serverar.. Tack till Loopia's support för att ni fick mig på rätt spår.

By Jesper Lind

Uppdatering 10920 av AJAX Control Toolkit

Uppdatering 10920 av AJAX Control Toolkit släpptes för lite mer än en vecka sen. Har installerat den på ett eget projekt idag och allt verkar fungera bra.

Uppdateringen innehåller inga ändringar som förstör gammal funktionalitet utan bjuder istället på många buggfixar. Man behöver inte modifiera Web.Config på något sätt utan det är bara att byta ut AjaxControlToolkit.dll mot den nyare versionen. Filerna finns att ladda ner på CodePlex.

Shawn Burke skriver mer om uppdateringen.

Delay's blog går in lite djupare och berättar även att man hade planerat att inkludera ett förbättrat ramverk för testning. Man hann dock inte med att få klart det i tid utan beslutade sig för att skjuta på det till framtiden. Något att se fram emot till nästa uppdatering med andra ord.

By Jesper Lind

Förhindra PostBack på ImageButton och kör JavaScript istället

Hade lite problem med att en ImageButton gjorde postback hela tiden, fast jag ville köra ett eget JavaScript. Trixet är att se till att return false; är med i slutet av JavaScript-anropet som jag läste om här.

<asp:TextBox ID="tbSearch" runat="server" />
<asp:ImageButton id="ibSearch"
OnClientClick="do_search();return false;"
ImageUrl="search-button.gif" runat="server" />
<script type="text/JavaScript">
function do_search()
{
window.location.href="search-results.aspx?s=" + document.getElementById('<%=tbSearch.ClientID %>').value;
}</script>

By Jesper Lind

Snyggt sätt att använda sig av Sessions

De flesta har någon gång stött på problemet med att man vill spara information mellan olika sidor och/eller olika postbacks. Då blir sessions ofta en sista utväg om något annat alternativ inte går att använda. Här visar vi ett enkelt och snyggt sätt att använda Sessionobjectet som vilken variabel som helst. Vi visar hur man enkelt kan spara en arraylist i en session.

public ArrayList NewProducts
{
get
{
if (Session["newProducts"] == null)
{
return new ArrayList();
}
else
{
return Session["newProducts"] as ArrayList;
}
}
set
{
Session["newProducts"] = value;
}
}

Det är en property som håller en session internt. Bara att tilldela och ta ut som en vanlig variabel. Behöver aldrig kontrollera och skapa session vid första användandet. Ofta resulterar det i att det står if(Session["newProducts"]!= null) överallt i koden, men det slipper man nu.

By Glenn Lundberg