Development

Vi er specialister i kode. Især i Umbraco CMS. Og vores seniorudviklere hos TYRA anstrenger sig for at skrive kode af høj kvalitet – leveret til tiden. 

Umbraco Cloud: Din genvej til sikker performance og et stabilt workflow

Hos GORM Agency oplever vi, at efterspørgslen på Umbraco Cloud stiger. Og ikke uden grund, vil vi mene. På denne side kan du blive klogere på, hvad Umbraco Cloud er, og hvordan du kommer i gang med det – enten internt eller i samarbejde med en ekstern leverandør.

Der er en række fordele ved et Umbraco Cloud-setup. Setuppet sikrer performance og er en genvej til et sikkert workflow mellem udviklings-, staging- og produktionsmiljøerne. Det er til gavn for både udviklere og indholdsredaktører.

Hvad er Umbraco Cloud?

Umbraco Cloud - eller Umbraco as a service, som det også kaldes – er muligheden for at samle driften af dit Umbraco CMS i skyen. Ved at have dit CMS der, overlader du bekymringen om opsætning af server, performance, pladsforbrug, sikkerhedsopdateringer, opgradering mm. til et hold af professionelle, hvis eneste fokus er at sørge for, at den tekniske platform spiller og yder sit bedste.

Det frigiver både tid, ressourcer og mentalt fokus hos dig, så du i stedet kan koncentrere dig om at skabe indhold til dit website og tage dig af andre dele af forretningen.

Produkter i skyen eller ”as a service” kan måske virke som udefinérbare størrelser, men i denne sammenhæng dækker det reelt, at dine Umbraco-installationer er placeret i en ekstern serverpark.

Pt. har du måske et webhotel eller egne servere stående, enten internt eller hos en hostingudbyder, og måske står du selv med ansvaret for at opgradere både Umbraco CMS, operativsystemer og serverhardware, alt imens du også skal sørge for backup og sikkerhed. Med Umbraco Cloud slipper du for disse tidskrævende arbejdsopgaver.

Umbracos serverpark er baseret på Microsoft Azure, og derfor har du glæde af alle fordelene herfra, for de gælder også for Umbraco Cloud:

• Hurtigt miljø
• Hurtig, stabil og pålidelig opbevaring af data
• Skalérbarhed, når der opstår behov for det

Herudover er der SSL, nem bruger- og domæneadministration ud af boksen samt powertools til at administrere sitet via PowerShell.

Teknikken er der altså ikke noget at sætte en finger på. Den klare fordel for dig som ejer websitet er, at du slipper for bekymringer – både ift. teknikken bag og ift. de løbende opgraderinger til Umbraco-løsningen.

Har I udviklere siddende, så vil Umbraco Cloud også give jer mulighed for at fokusere på at udvikle nye features, frem for at bruge tiden på at drifte servere og planlægge opgraderinger. På den måde kanaliserer I ressourcerne derhen, hvor det giver mest mening – og hvor det skaber forretning.

Læs også: Værdirapporten er dit værktøj til gennemsigtighed i forretningen

Hvorfor er Umbraco Cloud et fornuftigt valg?

Ret beset så adskiller Umbraco Cloud sig måske ikke så meget fra, hvordan du i dag oplever jeres Umbraco CMS.

Måske er opgraderinger af Umbraco noget, I i dag har eksterne leverandørere til at stå for, og måske ligger performance og oppetider som en del af en SLA med en hostingudbyder.

Hvis det er tilfældet, vil Umbraco Cloud måske kunne spare dig for nogle af de udgifter du i dag bruger på at vedligeholde og drifte din installation.

Er du udvikler, så får du mulighed for at arbejde med baselines, hvis du har flere projekter. En baseline er i bund og grund en skabelon for din kodebase, som kan genbruges på tværs af sites. Det har den fordel, at du undgår repetitivt arbejde og kan bruge ressourcerne klogere.

Umbraco Cloud kan imidlertid – og næsten med garanti – sikre dig en besparelse, idet dit arbejde som indholdsredaktør bliver optimeret. Samarbejdet mellem indholdsskabere og udviklere er langt mere ubesværet og uden risiko for forskellige versioner af sider og indhold.

Umbraco Cloud gør samarbejde nemt og sikkert

I Umbraco Cloud er arbejdet med indhold baseret på konceptet "ContentFlow". Som indholdsredaktør betyder det, at du har mulighed for at arbejde side om side med udviklingsholdet. Det optimale ContentFlow består af fire miljøer:

• Jeres lokale udviklingsmiljø
• Dev / udvikling i cloud’en
• Staging
• Produktion / live

I det lokale miljø arbejder udviklerne med features, og skubber dem til den fælles kodebase og dev-miljøet, når det er klar til at blive testet i det "rigtige" cloudmiljø. Her kan testere, product owners og andre stakeholders blive ”sluppet løs”.

Når der er konsensus om ændringerne, og de i øvrigt lever op til kravsspecifikation eller acceptkriterier, så bliver de skubbet videre til staging. Her bliver de forberedt til endelig udgivelse i produktionsmiljøet af indholdsredaktørerne. På staging arbejdes der med indholdet, så selve produktionsmiljøet står uberørt af udvikling og indholdsændringer.

Fordelen ved dette setup er, at udviklerne kun i begrænsede perioder ”spærrer” for indholdsredaktørerne. Den løbende udvikling og optimering er sat i faste rammer, der gør processen nemmere og gnidningsfri for udviklingsteamet.

Hele workflowet er smart, fordi I kan udvikle nye funktioner og arbejde på nyt indhold – og vel at mærke løbende kan teste, uden at livemiljøet bliver påvirket. På den måde vil jeres kunder og brugere ikke mærke noget, før I vælger at publicere de nye funktioner og indhold. Det sikrer både stabil performance og sætter brugernes oplevelse højt

Læs også: Umbraco Cloud: Sådan kommer du i gang

Har du brug for sparring til, hvordan man bedst griber en Umbraco Cloud-løsning an, måske fra en ældre Umbraco-version eller et andet CMS-system, eller et nyt website helt fra bunden? Så er vi hos GORM og TYRA klar til at tage en snak om dine muligheder.

System.Web.HttpException (0x80004005): Error executing child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'. ---> System.NullReferenceException: Unable to get Form with ID: '24fd19bb-0a3d-4c66-a39e-465e197de76a' off disk or from the cache. Check the file exists on disk
at Umbraco.Forms.Data.Storage.FormStorage.GetForm(Guid id)
at Umbraco.Forms.Web.Controllers.UmbracoFormsController.GetForm(Guid formId)
at Umbraco.Forms.Web.Controllers.UmbracoFormsController.GetFormModel(Guid formId, Nullable`1 recordId)
at lambda_method(Closure , ControllerBase , Object[] )
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.b__3d()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.b__3f()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.b__3f()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.b__3f()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.b__3f()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.<>c__DisplayClass2b.b__1c()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.b__1e(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult)
at System.Web.Mvc.Controller.b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult)
at System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult)
at System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult)
at System.Web.Mvc.MvcHandler.b__5(IAsyncResult asyncResult, ProcessRequestState innerState)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult)
at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
at System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper.<>c__DisplayClass4.b__3()
at System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper.Wrap[TResult](Func`1 func)
at System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride)
at System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride)
at System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage)
at System.Web.HttpServerUtility.Execute(IHttpHandler handler, TextWriter writer, Boolean preserveForm)
at System.Web.Mvc.Html.ChildActionExtensions.ActionHelper(HtmlHelper htmlHelper, String actionName, String controllerName, RouteValueDictionary routeValues, TextWriter textWriter)
at System.Web.Mvc.Html.ChildActionExtensions.RenderAction(HtmlHelper htmlHelper, String actionName, String controllerName, Object routeValues)
at ASP._Page_Views_Partials_Sections_FormSection_cshtml.Execute() in c:\inetpub\websites\agency_gorm_www\Views\Partials\Sections\FormSection.cshtml:line 51
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
at Umbraco.Core.Profiling.ProfilingView.Render(ViewContext viewContext, TextWriter writer)
at System.Web.Mvc.Html.PartialExtensions.Partial(HtmlHelper htmlHelper, String partialViewName, Object model, ViewDataDictionary viewData)
at ASP._Page_Views_SectionPage_cshtml.Execute() in c:\inetpub\websites\agency_gorm_www\Views\SectionPage.cshtml:line 21