tirsdag den 13. maj 2014

JSON har 'd' property?


Hvis du opgraderer fra .NET 2.0 til fx .NET 3.5, så vil du opdage at nogle af dine metoder måske returnerer noget andet tilbage til dit javascript.

Det er fordi at der er kommet en sikkerhedsopdatering til .NET 3.5 som gør at returnerer du ting der ikke er objekter, så pakkes de ind i et objekt med en property kaldet 'd'. Dette er på grund af cross site scripting attacks.
Dette er fordi at hvis du returnerer en string kan dette være et array, og så snart du får det tilbage kan kode indeni i det faktisk afvikles, selvom du ikke har tilgået det endnu.
Så hvis fx du returnerer et array med strings som har <script>alert('hello world')</script>, så vil koden blive afviklet og det gør det usikkert.
Fx kunne man indsætte et script som kalder en json server på et andet domæne (er supporteret i script tags), som returnerer eksekverbar kode, som fx overloader objektet og derigennem får adgang til data'ene fra det andet domæne.
Faktisk er det også en af grundene til at GET ikke er enabled fx når du starter med at lave json actions i ASP.NET MVC.
Udover det så er det bedre praksis at returnere et objekt, for fx. hvis du ønsker at tilføje noget mere data så er dit array ikke stort nok, og validering er meget besværligt at indbygge i dit array.
Ved at det er et objekt så har du mulighed for at lave en data annotation som validerer dine data når de kommer tilbage til serveren.

Så dette vil sige at alle de webmethods du før har haft (fx i webforms) vil nu ikke længere returnere din string direkte tilbage til dit javascript eller jQuery, men returnere et objekt med d property som har det du sender tilbage.

En måde at gøre din kode kompatibel med begge dele er ved at sætte dine data til at håndtere begge scenarier.

var returnValue = {returned json data from ajax call}
var realValue = null;
if (returnValue.hasOwnProperty('d'))
{
      realValue = returnValue.d;
}
else
{
      realValue = returnValue;
}

Således vil din webmethod med string, int, etc. stadig virke som den altid har, uanset hvilken version af .NET du kører, også uanset om det er objekter eller ej.

Ingen kommentarer:

Send en kommentar

Kan du lide mit indlæg, har en kommentar, forslag eller andet på hjerte så skriv venligst