{"id":92433,"date":"2020-08-27T07:42:01","date_gmt":"2020-08-27T05:42:01","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/viennanet-nabor-bibliotek-dlya-backenda"},"modified":"2020-08-27T07:42:01","modified_gmt":"2020-08-27T05:42:01","slug":"viennanet-nabor-bibliotek-dlya-backenda","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/viennanet-nabor-bibliotek-dlya-backenda","title":{"rendered":"ViennaNET: Sada knihoven pro backend","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ahoj v\u0161ichni!<\/p>\n<p><\/p>\n<p>Jsme komunitou .NET v\u00fdvoj\u00e1\u0159\u016f Raiffeisenbank a chceme v\u00e1m p\u0159edstavit sadu infrastrukturn\u00edch knihoven na .NET Core pro rychl\u00e9 vytv\u00e1\u0159en\u00ed mikroservis s jednotn\u00fdm ekosyst\u00e9mem. Uvolnili jsme to jako Open Source! <\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/raiffeisenbank\/blog\/494830\/\"><img decoding=\"async\" alt=\"ViennaNET: Sada knihoven pro backend\" src=\"\/wp-content\/uploads\/2020\/08\/eb063b3083da2c39f7f3c40a560c30ab.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Trocha historie<\/h3>\n<p><\/p>\n<p>Kdysi jsme m\u011bli velk\u00fd monolitick\u00fd projekt, kter\u00fd se postupn\u011b transformoval na sadu mikroservis (o zvl\u00e1\u0161tnostech tohoto procesu si m\u016f\u017eete p\u0159e\u010d\u00edst v <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/raiffeisenbank\/blog\/458404\/\">tomto \u010dl\u00e1nku<\/a><\/noindex>). B\u011bhem procesu jsme se setkali s probl\u00e9mem, \u017ee p\u0159i vytv\u00e1\u0159en\u00ed nov\u00fdch mikroservis jsme \u010dasto museli kop\u00edrovat r\u016fzn\u00e1 infrastrukturn\u00ed \u0159e\u0161en\u00ed \u2013 jako jsou konfigurace logov\u00e1n\u00ed, pr\u00e1ce s datab\u00e1z\u00ed, WCF atd. Na tomto projektu pracoval jeden t\u00fdm a v\u0161ichni si ji\u017e zvykli na ur\u010ditou ust\u00e1lenou metodiku pr\u00e1ce s infrastrukturou. Proto jsme vy\u010dlenili spole\u010dn\u00fd k\u00f3d do samostatn\u00e9ho repozit\u00e1\u0159e, sestaven\u00e9 knihovny jsme zabalili do NuGet bal\u00ed\u010dk\u016f a um\u00edstili je do na\u0161eho intern\u00edho NuGet \u00falo\u017ei\u0161t\u011b.<\/p>\n<p><\/p>\n<p>\u010cas plynul, projekt se postupn\u011b \u0161t\u011bpil, objevila se touha vytv\u00e1\u0159et nov\u00e9 moduly klientsk\u00e9 \u010d\u00e1sti pomoc\u00ed modern\u00edho Js frameworku a spou\u0161t\u011bt je v prohl\u00ed\u017ee\u010di. Za\u010dali jsme p\u0159ech\u00e1zet z WCF\/SOAP na REST\/HTTP, a proto jsme pot\u0159ebovali nov\u00e9 knihovny pro rychl\u00fd start slu\u017eeb na b\u00e1zi AspNet WebApi. Prvn\u00ed verzi na .NET Framework 4.5 vytvo\u0159il n\u00e1\u0161 architekt t\u00e9m\u011b\u0159 na kolen\u011b ve sv\u00e9m voln\u00e9m \u010dase, ale u\u017e z krabice umo\u017e\u0148ovala t\u0159emi \u0159\u00e1dky v Program.cs spustit slu\u017ebu, kter\u00e1 obsahovala autorizaci (NTLM), logov\u00e1n\u00ed, Swagger, IoC\/DI na b\u00e1zi Castle Windsor, nakonfigurovan\u00e9 HTTP klienty, kter\u00e9 p\u0159ed\u00e1valy r\u016fzn\u00e9 hlavi\u010dky pro zaji\u0161t\u011bn\u00ed pr\u016fchodu logov\u00e1n\u00ed po cel\u00e9m projektu. A to v\u0161e bylo mo\u017en\u00e9 nav\u00edc konfigurovat p\u0159\u00edmo v konfigura\u010dn\u00edm souboru slu\u017eby.<\/p>\n<p><\/p>\n<p>Nicm\u00e9n\u011b ne v\u0161echno bylo hladk\u00e9: tato knihovna se uk\u00e1zala jako extr\u00e9mn\u011b nepru\u017en\u00e1, pokud \u0161lo o zav\u00e1d\u011bn\u00ed nov\u00fdch modul\u016f. Nap\u0159\u00edklad, pokud bylo pot\u0159eba p\u0159idat n\u011bjak\u00e9 speci\u00e1ln\u00ed midlleware, museli jsme vytvo\u0159it novou sestavu a d\u011bdit od z\u00e1kladn\u00ed t\u0159\u00eddy spou\u0161t\u011bj\u00edc\u00ed slu\u017ebu, co\u017e bylo velmi nepohodln\u00e9. Na\u0161t\u011bst\u00ed takov\u00fdch p\u0159\u00edpad\u016f nebylo p\u0159\u00edli\u0161 mnoho.<\/p>\n<p><\/p>\n<h3>\u00c9ra Dockeru a Kubernetes<\/h3>\n<p><\/p>\n<p>P\u0159i\u0161el \u010das, kdy k n\u00e1m dorazila vlna s Dockerem a Kubernetes, kterou jsme pozorn\u011b sledovali: byla to skv\u011bl\u00e1 p\u0159\u00edle\u017eitost, jak se posunout d\u00e1l v technologi\u00edch sm\u011brem k .Net Core. A to znamen\u00e1, \u017ee budeme pot\u0159ebovat novou infrastrukturu pro spu\u0161t\u011bn\u00ed slu\u017eeb: \u010d\u00e1st knihoven p\u0159e\u0161la z .Net Framework na .Net Standard a .Net Core prakticky bez zm\u011bn, \u010d\u00e1st s drobn\u00fdmi vylep\u0161en\u00edmi. Ale nejv\u00edce jsme cht\u011bli p\u0159epracovat funk\u010dnost spojenou se spu\u0161t\u011bn\u00edm slu\u017eeb na AspNet Core.<\/p>\n<p><\/p>\n<p>Prvn\u00edm krokem bylo zva\u017eov\u00e1n\u00ed konceptu, kter\u00fd by odstranil hlavn\u00ed nedostatek p\u0159edchoz\u00ed verze: nedostatek flexibility. Proto bylo rozhodnuto ud\u011blat cel\u00fd syst\u00e9m knihoven co nejv\u00edce nez\u00e1visl\u00fd a modul\u00e1rn\u00ed a sestavit pot\u0159ebn\u00e9 slu\u017eby podle funkce jako stavebnici.<\/p>\n<p><\/p>\n<p>Hlavn\u00edm c\u00edlem je vytvo\u0159it jednotn\u00fd p\u0159\u00edstup, kter\u00fd popisuje, jak interagovat s datab\u00e1zemi, sb\u011brnicemi a dal\u0161\u00edmi slu\u017ebami. Sna\u017eili jsme se, aby integrace byly rychl\u00e9 a bezbolestn\u00e9 a aby se v\u00fdvoj\u00e1\u0159i mohli soust\u0159edit na psan\u00ed obchodn\u00ed logiky, a ne na infrastrukturu \u2013 ta je u\u017e p\u0159ipravena. Spole\u010dn\u00fd repozit\u00e1\u0159 pom\u00e1h\u00e1 zlep\u0161it zku\u0161enosti s interakc\u00ed uvnit\u0159 t\u00fdm\u016f: kdy\u017e se pou\u017e\u00edvaj\u00ed velmi podobn\u00e9 intern\u00ed infrastruktury, je snaz\u0161\u00ed zapojit se do v\u00fdvojov\u00e9ho procesu jin\u00e9ho t\u00fdmu a sd\u00edlet odborn\u00e9 znalosti.<\/p>\n<p><\/p>\n<h3>A pro\u010d pot\u0159ebujeme Open Source?<\/h3>\n<p><\/p>\n<p>Chceme uk\u00e1zat zralost na\u0161\u00ed odbornosti a z\u00edskat kvalitn\u00ed zp\u011btnou vazbu: \u010dlov\u011bk mimo banku m\u016f\u017ee p\u0159in\u00e9st n\u011bco nov\u00e9ho. Tak\u00e9 n\u00e1s zaj\u00edm\u00e1 rozvoj praktik pr\u00e1ce s mikroslu\u017ebami a DDD na .NET v pr\u016fmyslu, mo\u017en\u00e1 si n\u011bkdo bude cht\u00edt vz\u00edt ur\u010dit\u00e9 \u010d\u00e1sti frameworku pro sebe. <\/p>\n<p><\/p>\n<h3>Vlastn\u011b, ViennaNET<\/h3>\n<p><\/p>\n<p>Te\u010f se pod\u00edvejme na v\u0161e podrobn\u011bji. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Raiffeisen-DGTL\/ViennaNET\">Cel\u00fd zdrojov\u00fd k\u00f3d jsme um\u00edstili sem<\/a><\/noindex>. <\/p>\n<p><\/p>\n<h4>ViennaNET.WebApi.*<\/h4>\n<p><\/p>\n<p>Tato sada knihoven se skl\u00e1d\u00e1 z \"ko\u0159ene\" ViennaNET.WebApi, kter\u00fd obsahuje stavbu t\u0159\u00eddy pro slu\u017ebu CompanyHostBuilder, a skupiny konfigur\u00e1tor\u016f ViennaNET.WebApi.Configurators.*, p\u0159i\u010dem\u017e ka\u017ed\u00fd z nich umo\u017e\u0148uje p\u0159idat a konfigurovat ur\u010ditou funk\u010dnost do vytv\u00e1\u0159en\u00e9 slu\u017eby. Mezi konfigur\u00e1tory lze nal\u00e9zt propojen\u00ed logov\u00e1n\u00ed, diagnostiky, typu autentizace a autorizace, swaggeru atd.<\/p>\n<p><\/p>\n<p>ViennaNET.WebApi.Runners.* obsahuje p\u0159edem nakonfigurovan\u00e9 stavitele slu\u017eeb. Tyto bal\u00edky umo\u017e\u0148uj\u00ed zapomenout na to, jak\u00e9 konfigur\u00e1tory je t\u0159eba p\u0159ipojit p\u0159i tvorb\u011b nov\u00e9 slu\u017eby. Ani v nejmen\u0161\u00edm neomezuj\u00ed funk\u010dnost stavitele slu\u017eeb.<\/p>\n<p><\/p>\n<h4>ViennaNET.Mediator.*<\/h4>\n<p><\/p>\n<p>Knihovny, kter\u00e9 umo\u017e\u0148uj\u00ed vytvo\u0159it vnit\u0159n\u00ed zprost\u0159edkovatelskou sb\u011brnici pro p\u0159\u00edkazy a dotazy uvnit\u0159 slu\u017eby. Tento p\u0159\u00edstup sni\u017euje po\u010det DI-injekc\u00ed na jednu, nap\u0159\u00edklad ve controllerech. D\u00edky tomu lze p\u0159id\u00e1vat r\u016fzn\u00e9 dekor\u00e1tory k dotaz\u016fm, co\u017e sjednocuje jejich zpracov\u00e1n\u00ed a zkracuje mno\u017estv\u00ed k\u00f3du. <\/p>\n<p><\/p>\n<h4>ViennaNET.Validation<\/h4>\n<p><\/p>\n<p>Knihovna obsahuj\u00edc\u00ed sadu t\u0159\u00edd pro vytv\u00e1\u0159en\u00ed valida\u010dn\u00edch pravidel a sekvenc\u00ed z nich. Velmi u\u017eite\u010dn\u00e9 pro implementaci dom\u00e9nov\u00e9 validace, proto\u017ee umo\u017e\u0148uje popsat ka\u017edou obchodn\u00ed podm\u00ednku jako jednoduch\u00e9 a samostatn\u00e9 pravidlo. <\/p>\n<p><\/p>\n<h4>ViennaNET.Redis<\/h4>\n<p><\/p>\n<p>Knihovna s ob\u00e1lkami pro pohodlnou pr\u00e1ci s Redis jako in-memory cache.<\/p>\n<p><\/p>\n<h4>ViennaNET.Specifications<\/h4>\n<p><\/p>\n<p>Knihovna obsahuj\u00edc\u00ed t\u0159\u00eddy implementuj\u00edc\u00ed vzor \u201eSpecifikace\u201c.<\/p>\n<p><\/p>\n<p>To rozhodn\u011b nen\u00ed v\u0161echno, co m\u00e1me v na\u0161em arzen\u00e1lu. Ostatn\u00ed si m\u016f\u017eete prohl\u00e9dnout <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Raiffeisen-DGTL\/ViennaNET\">v repozit\u00e1\u0159i na GitHubu.<\/a><\/noindex>. Brzy pl\u00e1nujeme vyd\u00e1n\u00ed na\u0161ich knihoven pro pr\u00e1ci s datab\u00e1zemi na OpenSource.<\/p>\n<p><\/p>\n<p>D\u011bkujeme za pozornost, t\u011b\u0161\u00edme se na va\u0161e koment\u00e1\u0159e a pull requesty.<\/p>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/raiffeisenbank\/blog\/494830\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e .NET-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0420\u0430\u0439\u0444\u0444\u0430\u0439\u0437\u0435\u043d\u0431\u0430\u043d\u043a\u0430 \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043d\u0430 .NET Core \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441 \u0435\u0434\u0438\u043d\u043e\u0439 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439. \u0412\u044b\u0432\u0435\u043b\u0438 \u0435\u0433\u043e \u0432 Open Source! \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u041a\u043e\u0433\u0434\u0430-\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0441\u044f \u0432 \u043d\u0430\u0431\u043e\u0440 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 (\u043e\u0431 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435). \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":92434,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-92433","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e .NET-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0420\u0430\u0439\u0444\u0444\u0430\u0439\u0437\u0435\u043d\u0431\u0430\u043d\u043a\u0430 \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043d\u0430 .NET Core \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441 \u0435\u0434\u0438\u043d\u043e\u0439 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/viennanet-nabor-bibliotek-dlya-backenda\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47ViennaNET: \u043d\u0430\u0431\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f backend\u2019\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e .NET-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0420\u0430\u0439\u0444\u0444\u0430\u0439\u0437\u0435\u043d\u0431\u0430\u043d\u043a\u0430 \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043d\u0430 .NET Core \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441 \u0435\u0434\u0438\u043d\u043e\u0439 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/viennanet-nabor-bibliotek-dlya-backenda\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-27T05:42:01+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-27T05:42:01+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47ViennaNET: sada knihoven pro backend | ProHoster","description":"Ahoj v\u0161em! Jsme komunitou .NET v\u00fdvoj\u00e1\u0159\u016f Raiffeisenbank a chceme v\u00e1m p\u0159edstavit sadu infrastrukturn\u00edch knihoven na .NET Core pro rychl\u00e9 vytv\u00e1\u0159en\u00ed mikroslu\u017eeb s jednotn\u00fdm ekosyst\u00e9mem.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/viennanet-nabor-bibliotek-dlya-backenda","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47ViennaNET: \u043d\u0430\u0431\u043e\u0440 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f backend\u2019\u0430 | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e .NET-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0420\u0430\u0439\u0444\u0444\u0430\u0439\u0437\u0435\u043d\u0431\u0430\u043d\u043a\u0430 \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043d\u0430 .NET Core \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441 \u0435\u0434\u0438\u043d\u043e\u0439 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439.","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/viennanet-nabor-bibliotek-dlya-backenda","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-27T05:42:01+00:00","article:modified_time":"2020-08-27T05:42:01+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"92433","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:08:24","updated":"2022-10-03 07:52:44","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/92433","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=92433"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/92433\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/92434"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=92433"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=92433"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=92433"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}