<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
	<channel>
		<title>Author at Infinum</title>
		<atom:link href="https://infinum.com/blog/author/marko-hrncic/feed/" rel="self" type="application/rss+xml" />
		<link></link>
		<description>Building digital products</description>
		<lastBuildDate>Thu, 30 Apr 2026 13:44:05 +0000</lastBuildDate>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>

					<item>
				<image>
					<url>41245https://infinum.com/uploads/2023/07/Code_audit_hero-img-min.webp</url>
				</image>
				<title>Code Audit Decoded – What Is It and Do You Need One?</title>
				<link>https://infinum.com/blog/code-audit/</link>
				<pubDate>Wed, 02 Aug 2023 11:22:06 +0000</pubDate>
				<dc:creator>Marko Hrnčić</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=41245</guid>
				<description>
					<![CDATA[<p>Get acquainted with the concept of code audits. We explain what a code audit service is, who needs one and when, and what it typically entails.</p>
<p>The post <a href="https://infinum.com/blog/code-audit/">Code Audit Decoded – What Is It and Do You Need One?</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-297"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-92">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-95"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-93">
	<p	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-94'
	>
	Whether you’re looking to build a digital product or upgrade an existing one, this article will get you acquainted with <a href="https://infinum.com/blog/why-code-audits-are-essential-for-every-software-project/" target="_blank" rel="noreferrer noopener">the concept of code audits</a>. We explain what a code audit service is, who needs one and when, and what it typically entails.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-98"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-96">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-97'
	>
	When was the last time you took your car to the mechanic for routine maintenance? If we had to guess, we’d say it was probably at some point in the last year. This is simply good practice, even required by law in some countries. You want to know if there’s a problem before that car breaks down and leaves you stranded in the middle of nowhere.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-101"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-99">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-100'
	>
	And when was the last time you had your code thoroughly inspected?&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-104"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-102">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-103'
	>
	Code, like cars, isn’t made to last forever, no matter how well-written. It requires regular maintenance and check-ups to keep working properly. Preferably before that app starts crashing in the hands of your users.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-107"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-105">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-106'
	>
	If you want to future-proof your digital product and make sure it continues to serve its purpose, read on.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-110"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-108">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-109'
	>
	What is a code audit, and why is it important?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-113"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-111">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-112'
	>
	Let’s start with the definition:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-116"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-114">
	<p	class='typography typography--size-20-text-roman js-typography block-typography__typography'
	data-id='es-115'
	>
	“<em>A software code audit is a comprehensive analysis of source code in a programming project with the intent of discovering bugs, security breaches, or violations of programming conventions</em>.” &#8211; <a href="https://en.wikipedia.org/wiki/Code_audit" target="_blank" rel="noreferrer noopener">Wikipedia</a></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-118"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-117'
	>
	<strong>Though the word “audit” may prompt certain negative associations, a code audit is essential for any digital product, either in development or in production. It will reveal issues that currently exist in the code and predict those that may appear in the future.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-121"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-119">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-120'
	>
	Problems with source code are just like online security issues – when everything works as intended, nobody notices them. However, if a vulnerability or a software bug opens the door for a cyber attack, you’re in a world of trouble. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-128"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<a	class="card-simple js-card-simple card-simple--is-ad block-card__card-simple card-simple--has-link js-card-simple-link card-simple__content-align--left"
	data-id="es-122"
	 target='_blank' rel='noopener noreferrer' href='https://infinum.com/cybersecurity/'>

	
	
	<div class="card-simple__content">
		<div class="card-simple__heading-wrap">
			<p	class='typography typography--size-24-text js-typography card-simple__heading'
	data-id='es-123'
	>
	<strong><strong>The best way to avoid security issues is by establishing an ongoing secure development lifecycle<em>. </em><strong>Explore our software security consulting services </strong></strong></strong>to keep threats at bay.</p>		</div>

		<button	class="btn btn--color-infinum btn--size-small btn--width-default btn__icon-position--right card-simple__btn js-block-card-btn js-card-simple-link"
	data-id="es-125"
	 tabindex='-1'>
		<div class="btn__inner">
					<div	class='typography typography--size-none js-typography btn__label'
	data-id='es-126'
	>
	Learn more </div>		
		<i
	class="icon btn__icon icon--size-16 icon--scale-100"
	 aria-hidden='true' data-name='arrow-right-16' data-id='es-127'>
	<svg fill='none' height='16' viewBox='0 0 17 16' width='17' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><g stroke='currentColor' stroke-width='2'><path d='m.5 7.99999 14 .00001'/><path d='m9.23352 2.7251 5.97848 5.97852'/><path d='m9.23352 13.2744 5.97848-5.9785'/></g></svg></i>	</div>
	</button>	</div>
</a>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-131"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-129">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-130'
	>
	A code audit is not the same as a code review</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-134"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-132">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-133'
	>
	Since both these expressions often get thrown around, it’s important to make a distinction. Code reviews usually focus on much smaller portions of code and are a part of developers’ daily work. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-137"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-135">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-136'
	>
	For example, when implementing a new feature, one developer will <a href="https://infinum.com/blog/write-good-pull-requests/" target="_blank" rel="noreferrer noopener">review another one’s code</a>. It’s a simple check – an additional pair of eyes examining the work done. During the code review process, they will check if the code works, if it makes sense, and how it could be improved. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-140"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-138">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-139'
	>
	A code audit focuses on the bigger picture – the infrastructure, the architecture, vulnerability checks, along other aspects.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-143"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-141">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-142'
	>
	Who needs a code audit – and why?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-146"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-144">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-145'
	>
	Let’s make it really simple: all software needs a code audit. Whether your digital product is a web application, a mobile application, or an internal system, whether it is in development or in production, if it contains code – it needs a code audit on a regular basis.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-149"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-147">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-148'
	>
	To start with, software development projects usually take place in an agile setting. Time to market is important, and development teams often need to ship the PoC or MVP fast. In that phase, the priority is to build something that works, so certain security and performance issues can easily go under the radar. Once the project grows and goes into production, it’s important to address them.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-152"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-150">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-151'
	>
	Another reason is scalability. To return to the car metaphor, maybe you’re driving to work every day, and it is working fine, but maybe the circumstances will change in the future, and it will have to carry more load, drive on different roads or in different conditions, and that won’t be the case anymore. It is the same with digital products – your app may be working just fine with a couple of hundred users, but what happens if that number grows to several thousand?</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-155"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-153">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-154'
	>
	However, unlike repairing your car, software is easy to change. If we anticipate potential issues, we can make adjustments before they actually happen.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-158"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-156">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-157'
	>
	How to tell if you need a code audit?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-161"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-159">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-160'
	>
	If you’re wondering whether you need one, you probably do. But let’s identify a couple of scenarios where a code audit would be recommended: </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-164"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-162">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-163'
	>
	<li>You have an old project with an outdated code base</li><li>You are experiencing security and/or performance issues</li><li>You are looking to add new features to your existing digital product or upgrade it in any other way </li><li>Your project utilizes an older type of technology</li><li>You are introducing new team members to your project team or changing it altogether</li><li>You haven’t done one in a year</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-167"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-165">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-166'
	>
	We can’t emphasize strongly enough how quickly things change in the world of software development. Ways of working change, tools change, libraries change. If a digital product has been in use for some time, chances are that parts of its code base need updating.<br><br>What’s more, digital transformation is no longer a new thing. In this day and age, most companies already use some sort of digital tool. Clients who come to us with an existing digital product on their hands usually want to upgrade and improve it. However, focusing on which features to add makes no sense if you’re not adding them to a solid foundation.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-170"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-168">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-169'
	>
	Changes in the project team are another good reason to perform a code audit. New developers can have a hard time adapting to an existing code base if there are some issues with it. If the code is not readable and maintainable, they might need twice the time to get a feature to work. This is not only inefficient but will probably reflect on the overall cost of the project, not to mention team satisfaction and motivation.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-173"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-171">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-172'
	>
	Wait, isn’t that the Quality Assurance folks’ job?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-176"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-174">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-175'
	>
	Indeed, checking for bugs and errors is <a href="https://infinum.com/blog/faq-software-testing/" target="_blank" rel="noreferrer noopener">the whole point of quality assurance</a>. However, QA or software testing is more focused on the end product and less on its inner workings. QA engineers will test the product from a user’s perspective, while a code audit looks at its whole structure with developer eyes. A successful code audit provides a more in-depth look and usually identifies a large number of implementation issues that the QA team would not have observed. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-179"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-177">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-178'
	>
	Further, making sure the code base is in excellent condition will make quality assurance easier and more efficient, which benefits the whole project in the long run.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-182"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-180">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-181'
	>
	The code audit process, explained</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-185"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-183">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-184'
	>
	Now that we’ve covered the what, why, and when, let’s get into the actual steps involved in a code audit.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-188"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-186">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-187'
	>
	Step 1: Becoming acquainted with the domain</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-191"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-189">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-190'
	>
	In order to provide an educated opinion on the codebase, the team or person performing the audit needs to be familiar with the project domain. What is the problem that this digital product is trying to solve? Knowing the core idea helps engineers identify issues and recommend better solutions.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-194"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-192">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-193'
	>
	Step 2: Overall assessment of the codebase</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-197"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-195">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-196'
	>
	When they have a solid grasp of the product and its domain, the auditors can do a high-level assessment of the entire codebase. Knowing the main purpose of the product and its place in the industry allows them to recommend the best type of architecture, which can save clients both time and money. In this step, they also review the architecture in terms of scalability. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-200"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-198">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-199'
	>
	Step 3: Getting down to the code</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-203"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-201">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-202'
	>
	After the initial high-level assessment, we will take a very close look at the source code and examine it from different perspectives. Depending on the project, it may take a whole team to audit the code thoroughly – a backend developer, a frontend developer, a DevOps expert; each examining their own domain to detect any vulnerabilities.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-206"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-204">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-205'
	>
	Here are some aspects of the code that the auditors will be looking at.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-209"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-207">
	<h4	class='typography typography--size-30-text js-typography block-typography__typography'
	data-id='es-208'
	>
	Code readability</h4></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-212"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-210">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-211'
	>
	Is the source code well-written, and does it follow naming conventions? Are there any design patterns used? How much of the code is reused? </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-215"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-213">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-214'
	>
	Robert C. Martin, AKA Uncle Bob, the author of the book Clean Code said: “Clean code is code that is easy to understand and easy to read.” In fact, he claims that it is more important for code to be readable than for it to work. If a developer understands it, he can always make it work. And if the code doesn’t work and they can’t understand it, they also can’t fix it.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-218"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-216">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-217'
	>
	Further, checking for duplicate code is important in case an app’s business logic needs to be changed in the future. If the same chunk of code is used in five different places, any change will need to be made in all of them, which comes with the risk of missing a place that can potentially expose a bug.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-221"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-219">
	<h4	class='typography typography--size-30-text js-typography block-typography__typography'
	data-id='es-220'
	>
	Use of out-of-date tools</h4></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-224"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-222">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-223'
	>
	In their work, developers will often use libraries and existing implementations. As the web evolves, best practices and requests change, and so do tools. Code auditors will check if the tools used in the code are still supported and whether they are a potential security risk.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-227"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-225">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-226'
	>
	For example, a library can be used for generating reports within an app to turn code into a spreadsheet. Auditors will ask themselves if this tool has been updated, whether it is compliant with the latest security standards, and whether it is connected to any other parts of the code because one missing update can cause a chain of unwanted events.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-230"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-228">
	<h3	class='typography typography--size-30-text js-typography block-typography__typography'
	data-id='es-229'
	>
	Security risks</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-233"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-231">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-232'
	>
	While it is also possible to do a complete security audit, security is an important issue that is also checked within a code audit.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-236"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-234">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-235'
	>
	For example, SQL injections are one of the most common web hacking techniques that can destroy a database by injecting malicious software into it through queries. The auditors will be checking for such possibilities. They will also check how passwords are stored, whether they are encrypted in the database, whether there is a time-based backup or another backup system in place, etc.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-239"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-237">
	<h4	class='typography typography--size-30-text js-typography block-typography__typography'
	data-id='es-238'
	>
	Automated tests</h4></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-242"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-240">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-241'
	>
	No, we are not talking about the usual quality assurance tests. Often there are automated tests within the code – unit tests and integration tests. These ensure that the system works. Because the whole code base is interconnected, when something is changed with one feature, there is a strong possibility it will cause changes in other features too. With an automated test in place, the engineers working on the project will be warned about any malfunctions so they can fix them before the project goes into production.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-245"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-243">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-244'
	>
	In a code audit, engineers will check whether there are tests in place and what is the test coverage, suggesting areas of improvement. This is especially important for large-scale enterprise applications where it is practically impossible to check the entire code and the ways in which it is interconnected.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-248"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-246">
	<h4	class='typography typography--size-30-text js-typography block-typography__typography'
	data-id='es-247'
	>
	Documentation</h4></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-251"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-249">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-250'
	>
	Few developers will say they honestly enjoy writing documentation, which makes it no less necessary or useful. <a href="https://infinum.com/blog/software-documentation/" target="_blank" rel="noreferrer noopener">Quality documentation</a> is essential for introducing new team members to a project; it saves time and helps them work more efficiently. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-254"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-252">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-253'
	>
	However, in the agile world, documentation may not have been prioritized while the team was racing to get an MVP out, and then simply never returned to. This is why a thorough code audit will also check how well the code is documented, and whether the documentation is up to date. Quality documentation is a lifesaver, and poor documentation can be a big hindrance.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-257"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-255">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-256'
	>
	What are the outputs of a successful code audit?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-260"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-258">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-259'
	>
	Not completely unexpected, the main output is a detailed report, usually in written form. A code audit report will state the issues found with your software and preferably identify their level of severity. A good report should also provide projections about how these issues can affect your business, predict any potential losses in regards to time and money, and suggest how these problems can be solved.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-263"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-261">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-262'
	>
	When we’re performing a code audit as part of project work, it helps us know if there are any serious issues we need to fix before we can proceed. It also gives us a deep insight into your product’s code base, so adding extra features or upgrading the product is much easier and more efficient.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-266"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-264">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-265'
	>
	Why not get ChatGPT to do the task?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-269"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-267">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-268'
	>
	You may be wondering how come a code audit still includes so much manual work in these times when AI is thriving. There is a very wide selection of automated code review tools that can be very useful, but can never replace a comprehensive human-led code audit. In our work, we combine both – we use tools for certain parts of the process where this is appropriate and more efficient, and check manually where needed. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-272"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-270">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-271'
	>
	For example, static code analysis tools can help us get through thousands of lines of code to identify potential encryption issues. A tool of this type can reveal an outdated encryption algorithm, which can be a potential risk.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-274"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-273'
	>
	In their current state of progress, AI tools can be a great asset up to a certain level of complexity. After that, AI will have a hard time understanding the project’s domain and linking different concepts and integrations together into a meaningful whole. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-277"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-275">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-276'
	>
	In these circumstances, issues can easily go under the radar. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-280"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-278">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-279'
	>
	All AI tools, not just those used for reviewing code, tend to generalize and draw conclusions based on the most common scenarios. However, every project is unique, and without understanding its objectives and specifics, it’s impossible to make an educated decision about its code quality.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-283"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-281">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-282'
	>
	Future-proof your digital product</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-286"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-284">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-285'
	>
	In the world of digital products, where technology constantly evolves and brings new innovations, a code audit is an essential process that ensures your application is stable, secure, and future-proof. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-289"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-287">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-288'
	>
	In today&#8217;s agile development environment, time-to-market is crucial, and certain security and performance issues can easily go unnoticed during the development phase. A successful code audit is also very important for scalability – as a project grows and user numbers increase, potential vulnerabilities may emerge. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-292"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-290">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-291'
	>
	Since we like to take good care of software, we would always recommend a code audit to anyone who owns or manages any type of a digital product, especially if that product is set for an upgrade.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-295"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-293">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-294'
	>
	Just like taking your car for routine maintenance, it’s highly recommended to employ a code audit regularly to identify issues in the source code and prevent potential disasters down the road.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/code-audit/">Code Audit Decoded – What Is It and Do You Need One?</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>32893https://infinum.com/uploads/2023/01/How-to-Refresh-Data-in-Real-Time-with-Blazor-WebAssembly-and-SignalR-hero.webp</url>
				</image>
				<title>Refresh Data in Real Time with Blazor WebAssembly and SignalR</title>
				<link>https://infinum.com/blog/real-time-data-blazor-webassembly-signalr/</link>
				<pubDate>Tue, 31 Jan 2023 14:30:59 +0000</pubDate>
				<dc:creator>Marko Hrnčić</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=32893</guid>
				<description>
					<![CDATA[<p>If you're looking to equip your app with real-time data updates, SignalR and Blazor WebAssembly are a perfect combination.</p>
<p>The post <a href="https://infinum.com/blog/real-time-data-blazor-webassembly-signalr/">Refresh Data in Real Time with Blazor WebAssembly and SignalR</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-336"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-298">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-301"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-299">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-300'
	>
	More and more applications today rely on real-time technologies. Data is a critical aspect of every product, and users want to know what’s happening with their data now, not what was happening a minute ago.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-304"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-302">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-303'
	>
	Countless chat, dashboard, and other applications base their success on the speed and reliability of their data updates. If you’re looking to equip your app with these types of functionalities, this article explains how to use SignalR and Blazor WebAssembly – a perfect combination for displaying real-time data with little effort.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-307"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-305">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-306'
	>
	What is Blazor?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-310"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-308">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-309'
	>
	<a href="https://dotnet.microsoft.com/en-us/apps/aspnet/web-apps/blazor" target="_blank" rel="noreferrer noopener">Blazor</a> is an open-source framework developed by Microsoft used for creating web applications with C# and .NET. This approach makes it easier for .NET developers to enter the world of client web applications. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-313"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-311">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-312'
	>
	It might seem unusual to use C# for developing web applications since browsers understand JavaScript, but it can be achieved by compiling a .NET runtime into the WebAssembly bytecode. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-316"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-314">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-315'
	>
	In fact, it’s not just C#; we can run any language in the browser through WebAssembly. With Blazor, we can share client and server codes. On top of that, integration with <a href="https://www.docker.com/" target="_blank" rel="noreferrer noopener">Docker</a> and other hosting platforms is available.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-319"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-317">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-318'
	>
	Blazor offers multiple hosting options:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-322"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-320">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-321'
	>
	Blazor Server</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-325"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-323">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-324'
	>
	Blazor WebAssembly</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-328"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-326">
	<h2	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-327'
	>
	Blazor Server</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-331"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-329">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-330'
	>
	This option hosts Razor components in the ASP.NET Core Web App, which means that the application is 100% run on the server. Blazor Server uses <a href="https://dotnet.microsoft.com/en-us/apps/aspnet/signalr" target="_blank" rel="noreferrer noopener">SignalR</a> to communicate between the server and the client via the <a href="https://learn.microsoft.com/en-us/aspnet/core/fundamentals/websockets?view=aspnetcore-7.0" target="_blank" rel="noreferrer noopener">WebSockets protocol</a>. It allows for full .NET API compatibility. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-334"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-332">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-333'
	>
	With Blazor Server, each new browser window requires a new instance of a server-managed component state. Because of that, there is a constant bi-directional connection between the client and server, so it would be smart to consider scaling the application.</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-339"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-337"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-338">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2023/01/image1.webp"
					class="image__img block-media__image-img"
					alt=""
										height="403"
															width="636"
										loading="lazy"
					 />
					</picture>

			<figcaption class="image__figcaption block-media__image-figcaption">
			Source: <a href="https://learn.microsoft.com/en-us/aspnet/core/blazor/?view=aspnetcore-7.0" target="_blank" rel="noreferrer noopener">Microsoft documentation</a>		</figcaption>
	</figure></div></div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-366"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-340">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-343"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-341">
	<h2	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-342'
	>
	Blazor WebAssembly</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-346"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-344">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-345'
	>
	Blazor WebAssembly (WASM) allows us to build SPA (Single Page Application) client applications. Opening the application in a new browser window will download the source code.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-349"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-347">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-348'
	>
	However, this is not the only reason to use Blazor WebAssembly. Standard libraries and NuGet packages are still available with Blazor WASM. Another essential aspect is its performance, which is close to native.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-352"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-350">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-351'
	>
	Since WebAssembly runs in the JavaScript sandbox, we can use the following:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-355"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-353">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-354'
	>
	File API</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-358"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-356">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-357'
	>
	DOM</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-361"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-359">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-360'
	>
	Web Sockets</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-364"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-362">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-363'
	>
	Utilizing C# and JavaScript capabilities at the same time? Not bad at all. </p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-369"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-367"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-368">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2023/01/image4-1.webp"
					class="image__img block-media__image-img"
					alt=""
										height="402"
															width="477"
										loading="lazy"
					 />
					</picture>

			<figcaption class="image__figcaption block-media__image-figcaption">
			Source: <a href="https://learn.microsoft.com/en-us/aspnet/core/blazor/?view=aspnetcore-7.0" target="_blank" rel="noreferrer noopener">Microsoft documentation</a>		</figcaption>
	</figure></div></div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-410"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-370">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-373"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-371">
	<h2	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-372'
	>
	Blazor WebAssembly ASP.NET Core Hosted</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-376"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-374">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-375'
	>
	There is a new hosting option that comes with Blazor WebAssembly. It is an upgraded version of the standard Blazor WASM, which works well with browsers. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-378"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-24-text js-typography block-highlighted-text__typography'
	data-id='es-377'
	>
	<strong>If we choose Blazor WASM ASP.NET Core Hosted, the Blazor client and the backend code are hosted on the same website. On the other hand, with the standard Blazor WASM option, the backend app doesn’t have to be ASP.NET Core. It can be anything, hosted anywhere.</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-381"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-379">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-380'
	>
	If you’re a C# lover who wants to use C# and .NET for everything, this hosting option is your best bet.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-384"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-382">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-383'
	>
	In our example, we will use .NET Web API for the backend and Blazor WASM for the frontend. In our case, the communication happens through SignalR, but there are other possibilities with this hosting option. On the other hand, Blazor Server communication is restricted to SignalR only.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-387"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-385">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-386'
	>
	Differences between Blazor hosting options</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-390"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-388">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-389'
	>
	All Blazor hosting options have a specific purpose and can be useful in different cases. Here’s an overview of the pros and cons of each option.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-393"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-391">
	<h2	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-392'
	>
	Blazor Server pros and cons</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-396"
	 data-animation-target='inner-items'>
		
			<div class="block-group" data-id=es-395>
	
<div
	class="wrapper"
	data-id="es-394"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			
<figure class="wp-block-table is-style-regular table-body-white-space--pre-wrap" style="font-size:28px"><table><tbody><tr><td><strong>Pros</strong></td><td><strong>Cons</strong></td></tr><tr><td>Faster initial load; HTML content is pre-rendered, and application libraries are not downloaded</td><td>An internet connection is required</td></tr><tr><td>Support for older browsers that don’t support WebAssembly</td><td>Potential scalability issues because each client requires a connection to the server</td></tr><tr><td>Better security because the source code isn’t sent to the client</td><td>Higher latency because the data is sent from the server to the client</td></tr></tbody></table></figure>
		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-399"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-397">
	<h2	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-398'
	>
	Blazor WASM pros and cons</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-402"
	 data-animation-target='inner-items'>
		
			<div class="block-group" data-id=es-401>
	
<div
	class="wrapper"
	data-id="es-400"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			
<figure class="wp-block-table is-style-regular table-body-white-space--pre-wrap" style="font-size:28px"><table><tbody><tr><td><strong>Pros</strong></td><td><strong>Cons</strong></td></tr><tr><td>Offline support is enabled since the source code is downloaded</td><td>Older browsers without WebAssembly support are not available</td></tr><tr><td>Servers are not required</td><td>The initial download size is much larger</td></tr><tr><td>Once the source code is loaded, the performance is close to native.<br>The only thing that needs to be re-rendered is the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Introduction" target="_blank" rel="noreferrer noopener">DOM (Document Object Model)</a>, without external API calls</td><td>Limitations regarding .NET tools and debugging capabilities</td></tr></tbody></table></figure>
		</div>
	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-405"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-403">
	<h2	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-404'
	>
	Blazor WASM ASP.NET Core Hosted pros and cons</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-408"
	 data-animation-target='inner-items'>
		
			<div class="block-group" data-id=es-407>
	
<div
	class="wrapper"
	data-id="es-406"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			
<figure class="wp-block-table is-style-regular table-body-white-space--pre-wrap" style="font-size:28px"><table><tbody><tr><td><strong>Pros</strong></td><td><strong>Cons</strong></td></tr><tr><td>Complete solution deployed in one place with one tech-stack</td><td>An internet connection is required</td></tr><tr><td>Works well with database connections since the Web API is the backend</td><td>Client-side debugging is still in its early stages</td></tr><tr><td>Suitable for solutions entirely written in ASP.NET Core</td><td></td></tr></tbody></table></figure>
		</div>
	</div>
</div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-448"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-411">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-414"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-412">
	<h2	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-413'
	>
	Choosing the hosting option</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-417"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-415">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-416'
	>
	Deciding what would be the best hosting option for our case, we need to ask ourselves what the goal is. We want to create a solution for refreshing data in real time. Because dynamic data is involved, we need a server that will fetch data from the database, and we want to implement all the aspects with .NET and C#.&nbsp;&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-420"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-418">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-419'
	>
	Our best bet is the Blazor WASM ASP.NET Core Hosted option.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-423"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-421">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-422'
	>
	Sending data with Hosted Service and SignalR</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-426"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-424">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-425'
	>
	To send data from the backend Web API to the Blazor Client, we need to create a solution first.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-429"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-427">
	<h2	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-428'
	>
	Creating Blazor WASM ASP.NET Core Hosted solution</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-432"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-430">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-431'
	>
	We can create the Blazor solution in two different ways:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-435"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-433">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-434'
	>
	Command Prompt (.NET CLI)</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-438"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-436">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-437'
	>
	IDE (usually <a href="https://visualstudio.microsoft.com/" target="_blank" rel="noreferrer noopener">Visual Studio</a>)</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-441"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-439">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-440'
	>
	To create a Blazor WASM ASP.NET Core Hosted solution with the command prompt, we can use:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-443"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #005cc5;">em</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token" style="color: #005cc5;">dotnet</span><span class="token"> </span><span class="token" style="color: #d73a49;">new</span><span class="token"> </span><span class="token" style="color: #005cc5;">blazorwasm</span><span class="token"> </span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">–hosted</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">em</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-446"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-444">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-445'
	>
	We can also create a new solution in Visual Studio:</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-451"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-449"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-450">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2023/01/image3.webp"
					class="image__img block-media__image-img"
					alt=""
										height="285"
															width="630"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-460"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-452">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-455"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-453">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-454'
	>
	It is important to select the “ASP.NET Core Hosted” option.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-458"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-456">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-457'
	>
	After the scaffolding is done, we can check the solution structure:</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-463"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-461"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-462">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2023/01/image2.webp"
					class="image__img block-media__image-img"
					alt=""
										height="195"
															width="415"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-562"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-464">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-467"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-465">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-466'
	>
	By default, this hosting option consists of three different projects:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-470"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-468">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-469'
	>
	ReportApp.Client (Blazor WebAssembly)</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-473"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-471">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-472'
	>
	ReportApp.Server (.NET Core Web API)</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-476"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-474">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-475'
	>
	ReportApp.Shared</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-479"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-477">
	<h2	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-478'
	>
	SignalR server configuration</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-482"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-480">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-481'
	>
	To send data to the client, we need to configure SignalR on the server. First, we need to create a SignalR Hub, which enables communication between the client and the server:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-484"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #d73a49;">class</span><span class="token"> </span><span class="token" style="color: #6f42c1;">ReportHub</span><span class="token"> : Hub&lt;List&lt;Report&gt;&gt; &lt;br&gt;</span><span class="token">{</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #005cc5;">br</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">}</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-487"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-485">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-486'
	>
	Our hub is now configured to send a list of reports to the client. However, before the configuration is ready, we also need to add SignalR to the service collection:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-489"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #005cc5;">builder</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">Services</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #6f42c1;">AddSignalR</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-492"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-490">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-491'
	>
	Lastly, we need to register SignalR to the request pipeline:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-494"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #005cc5;">app</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">MapHub</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #005cc5;">ReportHub</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">(</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/reports</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-497"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-495">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-496'
	>
	With this in place, the client can communicate with the server through the specified path.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-500"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-498">
	<h2	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-499'
	>
	Sending data to the client with Background service</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-503"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-501">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-502'
	>
	Great, we are now ready to start sending data to the client.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-506"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-504">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-505'
	>
	We want to send our data to the client continuously in the background, and <a href="https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-7.0&amp;tabs=visual-studio" target="_blank" rel="noreferrer noopener">Hosted Service</a> is the way to go. That way, we can do our job without offering an interface to interact with because we don’t need it. Our background worker already knows what to do. It’s pretty simple; it only needs to send data.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-509"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-507">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-508'
	>
	In our case, we use the <code>BackgroundService</code> base class, which implements <code>IHostedService</code>:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-511"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #d73a49;">class</span><span class="token"> </span><span class="token" style="color: #6f42c1;">TimeWorker</span><span class="token"> : BackgroundService
</span></span><span class="line"><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">    private</span><span class="token"> </span><span class="token" style="color: #005cc5;">readonly</span><span class="token"> </span><span class="token" style="color: #005cc5;">IHubContext</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #005cc5;">ReportHub</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> </span><span class="token" style="color: #005cc5;">_reportHub</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">    private</span><span class="token"> </span><span class="token" style="color: #005cc5;">readonly</span><span class="token"> </span><span class="token" style="color: #005cc5;">IServiceProvider</span><span class="token"> </span><span class="token" style="color: #005cc5;">_serviceProvider</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">    public</span><span class="token"> </span><span class="token" style="color: #6f42c1;">TimeWorker</span><span class="token">(</span><span class="token" style="color: #6f42c1;">IHu</span><span class="token" style="color: #005cc5;">bContext</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #005cc5;">ReportHub</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> </span><span class="token" style="color: #005cc5;">reportHub</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">IServiceProvider</span><span class="token"> </span><span class="token" style="color: #005cc5;">serviceProvider</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">    </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">        _reportHub</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">reportHub</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">        _serviceProvider</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">serviceProvider</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">    protected</span><span class="token"> </span><span class="token" style="color: #005cc5;">override</span><span class="token"> </span><span class="token" style="color: #005cc5;">async</span><span class="token"> </span><span class="token" style="color: #005cc5;">Task</span><span class="token"> </span><span class="token" style="color: #6f42c1;">ExecuteAsync</span><span class="token">(</span><span class="token" style="color: #6f42c1;">Can</span><span class="token" style="color: #005cc5;">cellationToken</span><span class="token"> </span><span class="token" style="color: #005cc5;">stoppingToken</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">    </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">        while</span><span class="token"> (!</span><span class="token" style="color: #6f42c1;">stopp</span><span class="token" style="color: #005cc5;">ingToken</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">IsCancellationRequested</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">        </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">            using</span><span class="token"> </span><span class="token" style="color: #d73a49;">var</span><span class="token"> </span><span class="token" style="color: #005cc5;">scope</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">_serviceProvider</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #6f42c1;">CreateScope</span><span class="token">();
</span></span><span class="line"><span class="token" style="color: #005cc5;">            var</span><span class="token"> </span><span class="token" style="color: #005cc5;">reportDataService</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">scope</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">ServiceProvider</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">GetRequiredService</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #005cc5;">IReportDataService</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">            var</span><span class="token"> </span><span class="token" style="color: #005cc5;">reportData</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">await</span><span class="token"> </span><span class="token" style="color: #005cc5;">reportDataService</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #6f42c1;">GetReports</span><span class="token">();
</span></span><span class="line"><span class="token" style="color: #005cc5;">            var</span><span class="token"> </span><span class="token" style="color: #005cc5;">methodName</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">TransferReportData</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">            await</span><span class="token"> </span><span class="token" style="color: #005cc5;">_reportHub</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">Clients</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">All</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #6f42c1;">SendAsync</span><span class="token">(
</span></span><span class="line"><span class="token" style="color: #005cc5;">                methodName</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">                reportData</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">                stoppingToken</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">            await</span><span class="token"> </span><span class="token" style="color: #005cc5;">Task</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #6f42c1;">Delay</span><span class="token">(</span><span class="token" style="color: #6f42c1;">TimeSpan</span><span class="token">.</span><span class="token" style="color: #6f42c1;">Fr</span><span class="token" style="color: #6f42c1;">omSeconds</span><span class="token">(1), </span><span class="token" style="color: #6f42c1;">stoppin</span><span class="token" style="color: #005cc5;">gToken</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-514"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-512">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-513'
	>
	First, the method gets data from the database or any other data source and then sends it to all SignalR clients that are listening. The method is executed every second.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-517"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-515">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-516'
	>
	Next, we need to register the background service in our <code>Program class</code>:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-519"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #005cc5;">builder</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">Services</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">AddHostedService</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #005cc5;">TimeWorker</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-522"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-520">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-521'
	>
	Paying attention to how we use scoped services in background services is vital. Since a background service is registered as a singleton, all constructor injections will become singletons. To avoid issues, it’s better to use <a href="https://learn.microsoft.com/en-us/dotnet/api/system.iserviceprovider?view=net-7.0" target="_blank" rel="noreferrer noopener"><code>IServiceProvider</code></a> when working with scoped-type instances.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-525"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-523">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-524'
	>
	Listening for SignalR updates on the Blazor client</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-528"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-526">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-527'
	>
	The data is ready to be fetched; there’s no point in waiting. In our client Blazor app, we need to install the <a href="https://www.nuget.org/packages/Microsoft.AspNetCore.SignalR.Client" target="_blank" rel="noreferrer noopener"><code>SignalR.Client</code></a> NuGet package:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-530"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #005cc5;">em</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token" style="color: #005cc5;">dotnet</span><span class="token"> </span><span class="token" style="color: #005cc5;">add</span><span class="token"> </span><span class="token" style="color: #005cc5;">package</span><span class="token"> </span><span class="token" style="color: #005cc5;">Microsoft</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">AspNetCore</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">SignalR</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">Client</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">em</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-533"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-531">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-532'
	>
	The first step to get the data is to set up the connection in the Blazor component:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-535"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">private</span><span class="token"> </span><span class="token" style="color: #005cc5;">async</span><span class="token"> </span><span class="token" style="color: #005cc5;">Task</span><span class="token"> </span><span class="token" style="color: #6f42c1;">StartHubConnection</span><span class="token">(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">    var</span><span class="token"> </span><span class="token" style="color: #005cc5;">apiAddress</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">https://localhost:7077</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">    var</span><span class="token"> </span><span class="token" style="color: #005cc5;">sensorDataUrl</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">(</span><span class="token">$</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">{apiAddress}/reports</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">    _reportDataHubConnection</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">new</span><span class="token"> </span><span class="token" style="color: #005cc5;">HubConnectionBuilder</span><span class="token">(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">                    </span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #6f42c1;">WithUrl</span><span class="token">(</span><span class="token" style="color: #6f42c1;">sensorDataUrl</span><span class="token">)
</span></span><span class="line"><span class="token" style="color: #005cc5;">                    </span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #6f42c1;">Build</span><span class="token">();
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">    await</span><span class="token"> </span><span class="token" style="color: #005cc5;">_reportDataHubConnection</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #6f42c1;">StartAsync</span><span class="token">();
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-538"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-536">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-537'
	>
	Here we specify the server URL with the SignalR endpoint, which has to be the same as the one configured on the server. Next, we create a new <a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.signalr.client.hubconnection?view=aspnetcore-7.0" target="_blank" rel="noreferrer noopener"><code>HubConnection</code></a> object and start the connection.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-541"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-539">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-540'
	>
	Our next step is to set a listener to fetch the data from the server:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-543"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">private</span><span class="token"> </span><span class="token" style="color: #005cc5;">void</span><span class="token"> </span><span class="token" style="color: #6f42c1;">SetRefreshDataListener</span><span class="token">(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">    var</span><span class="token"> </span><span class="token" style="color: #005cc5;">methodName</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">TransferReportData</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">    _reportDataHubConnection</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">On</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #005cc5;">List</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #005cc5;">Report</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">(</span><span class="token" style="color: #005cc5;">methodName</span><span class="token">,</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #005cc5;">data</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">=&gt;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">    </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">        reports</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">data</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">        StateHasChanged</span><span class="token">();
</span></span><span class="line"><span class="token" style="color: #005cc5;">     </span><span class="token">}</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-546"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-544">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-545'
	>
	Here we specify the method name that corresponds to the one on the server and store the data in the variable. Later, we can use this variable to generate HTML data on the page. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-549"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-547">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-548'
	>
	Finally, the last step is to call the methods from the <a href="https://learn.microsoft.com/en-us/aspnet/core/blazor/components/lifecycle?view=aspnetcore-7.0#component-initialization-oninitializedasync" target="_blank" rel="noreferrer noopener"><code>OnInitalizeAsync</code></a> method inside the Blazor component:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-551"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">private</span><span class="token"> </span><span class="token" style="color: #005cc5;">List</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #005cc5;">Report</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token" style="color: #d73a49;">?</span><span class="token"> </span><span class="token" style="color: #005cc5;">reports</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">private</span><span class="token"> </span><span class="token" style="color: #005cc5;">HubConnection</span><span class="token" style="color: #d73a49;">?</span><span class="token"> </span><span class="token" style="color: #005cc5;">_reportDataHubConnection</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">protected</span><span class="token"> </span><span class="token" style="color: #005cc5;">override</span><span class="token"> </span><span class="token" style="color: #005cc5;">async</span><span class="token"> </span><span class="token" style="color: #005cc5;">Task</span><span class="token"> </span><span class="token" style="color: #6f42c1;">OnInitializedAsync</span><span class="token">(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #005cc5;">    await</span><span class="token"> </span><span class="token" style="color: #6f42c1;">StartHubConnection</span><span class="token">();
</span></span><span class="line"><span class="token" style="color: #6f42c1;">    SetRefreshDataListener</span><span class="token">();
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-554"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-552">
	<p	class='typography typography--size-20-text-roman js-typography block-typography__typography'
	data-id='es-553'
	>
	And this is it, success.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-557"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-555">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-556'
	>
	Summarizing our real-time journey</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-560"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-558">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-559'
	>
	Step by step, we’ve made our way to successful implementation. You are now ready to start creating your own fantastic real-time solutions with Blazor and SignalR. As you can see, real-time solutions like this are actually not hard to implement. At the same time, they are in high demand for many different scenarios and can definitely come in handy in the future.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/real-time-data-blazor-webassembly-signalr/">Refresh Data in Real Time with Blazor WebAssembly and SignalR</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
		
	</channel>
</rss>