European ASP.NET 4.5 Hosting BLOG

BLOG about ASP.NET 4, ASP.NET 4.5 Hosting and Its Technology - Dedicated to European Windows Hosting Customer

European ASP.NET Core Hosting - HostForLIFE :: Dynamic Rules Engine for.NET Financial App User Workflows

clock January 20, 2025 07:55 by author Peter

You must create a system that enables flexible, dynamic rule generation and execution based on user context (such as roles, account details, transaction kinds, etc.) in order to use.NET to implement a Rules Engine for user-specific workflows in a financial application. For business logic, a rules engine offers an abstraction layer that makes upgrades, maintenance, and user-specific adaptations simple.

1. Understand the Financial Domain
Financial applications typically deal with transactions, account balances, regulatory requirements, fraud detection, and other rules that can be user- or context-specific. In this example, let’s assume we're building a rules engine for managing financial transactions where rules need to be applied based on.

  • Account type (savings, checking, business, etc.).
  • Transaction type (deposit, withdrawal, transfer, etc.).
  • Transaction amount.
  • User role (admin, regular user, auditor, etc.).
  • User-specific preferences (risk appetite, investment profile).

2. Define the Rule Structure

A rule typically contains.

  • Condition: The condition or predicate that must be true for the rule to execute (e.g., transaction amount > $500).
  • Action: The result or effect if the rule is triggered (e.g., send a notification, log an event, or block the transaction).
  • User Context: The context in which the rule is evaluated (e.g., user role, account type).

In the financial system, rules might look like.

  • If the transaction amount is> $1000 and the account type is business, fraud detection is triggered.
  • If the account balance is < $50 and the withdrawal request is for $100, block the withdrawal.

3. Create a Rule Interface
Create a base interface for rules that can be implemented for different types of rules.
public interface IRule
{
bool Evaluate(UserContext context, Transaction transaction);
void Execute(Transaction transaction);
}

4. Define Specific Rule Implementations
Implement specific rules based on the financial domain.

Example: Transaction Amount Limit Rule.
public class TransactionAmountLimitRule : IRule
{
private readonly decimal _limit;
public TransactionAmountLimitRule(decimal limit)
{
    _limit = limit;
}
public bool Evaluate(UserContext context, Transaction transaction)
{
    return transaction.Amount > _limit;
}
public void Execute(Transaction transaction)
{
    Console.WriteLine($"Transaction amount exceeds the limit of {_limit}. Action required.");
}
}

Example: Account Type and Fraud Detection Rule.
public class FraudDetectionRule : IRule
{
public bool Evaluate(UserContext context, Transaction transaction)
{
    return transaction.Amount > 1000 && context.AccountType == "Business";
}

public void Execute(Transaction transaction)
{
    Console.WriteLine($"Fraud detection triggered for transaction of {transaction.Amount} on business account.");
    // Integrate with a fraud detection system here
}
}


5. Create the User Context and Transaction Classes
Define classes to represent user and transaction data. These objects will be passed to the rules engine to evaluate whether a rule should fire.
public class UserContext
{
public string Role { get; set; }
public string AccountType { get; set; }
public decimal AccountBalance { get; set; }

// Other user-specific data...
}

public class Transaction
{
public decimal Amount { get; set; }
public string TransactionType { get; set; }
public string AccountId { get; set; }

// Other transaction details...
}

6. Rules Engine Execution
The core of the rules engine is to evaluate the conditions and execute the rules. You can use a chain of responsibility pattern, a strategy pattern, or a simple loop to apply the rules.
public class RulesEngine
{
private readonly List<IRule> _rules;
public RulesEngine()
{
    _rules = new List<IRule>();
}
public void AddRule(IRule rule)
{
    _rules.Add(rule);
}
public void ExecuteRules(UserContext context, Transaction transaction)
{
    foreach (var rule in _rules)
    {
        if (rule.Evaluate(context, transaction))
        {
            rule.Execute(transaction);
        }
    }
}
}


7. Implementing User-Specific Workflow
Depending on the user’s role or account type, different rules might be triggered. For example.
A "Premium User" might have different transaction limits.
An "Admin" may be exempt from certain fraud detection rules.

var userContext = new UserContext
{
Role = "Regular",
AccountType = "Business",
AccountBalance = 1200
};
var transaction = new Transaction
{
Amount = 1500,
TransactionType = "Withdrawal",
AccountId = "12345"
};
// Initialize rules engine and add rules
var rulesEngine = new RulesEngine();
rulesEngine.AddRule(new TransactionAmountLimitRule(1000));
rulesEngine.AddRule(new FraudDetectionRule());
// Execute rules for the given context and transaction
rulesEngine.ExecuteRules(userContext, transaction);

8. User-Specific Workflow Example
In practice, rules can be set up to dynamically adjust based on the user context.
if (userContext.Role == "Premium")
{
rulesEngine.AddRule(new TransactionAmountLimitRule(5000));  // Higher limit for premium users
}
else if (userContext.Role == "Admin")
{
rulesEngine.AddRule(new NoFraudDetectionRule());  // Admin users may not be subject to fraud detection
}
// Then, execute the rules for the user's specific context
rulesEngine.ExecuteRules(userContext, transaction);


9. Persisting and Managing Rules Dynamically
For flexibility, you can store the rules in a database, and even allow rules to be edited via an admin UI. This allows you to modify workflows without changing the application code.

  • Store rules as JSON, XML, or database records.
  • Load rules dynamically based on the user or transaction type.
  • Allow admins to manage rules from a UI or API.

For dynamic rule evaluation.
public class DynamicRuleLoader
{
public IEnumerable<IRule> LoadRules(UserContext userContext)
{
    // Query database or external source to load applicable rules for the user
    return new List<IRule>
    {
        new TransactionAmountLimitRule(1000),
        new FraudDetectionRule()
    };
}
}


10. Testing and Maintenance

  • Unit Testing: Each rule can be unit tested independently by mocking user contexts and transactions.
  • Performance Considerations: Optimize for performance if the rules engine is large or if rules are complex. For example, caching user-specific rules, batching rule evaluations, or implementing a priority queue for rule execution.
  • Audit Logging: For financial systems, ensure that rule evaluations and their outcomes are logged for compliance and auditing purposes.

Incorporating a dynamic and flexible rules engine for user-specific workflows in a . NET-based financial application can significantly enhance the system's ability to handle diverse business logic, user contexts, and complex transaction scenarios. By leveraging a well-structured rules engine, financial institutions can ensure that transaction processing, fraud detection, and user-specific workflows are handled efficiently and consistently.

The system can be tailored to meet evolving business demands, regulatory compliance, and user preferences by defining rules based on a variety of user factors (like roles, account types, and preferences) and transaction characteristics (like amount, type, and status). Business rules can be updated without requiring significant modifications to the underlying software thanks to the separation of business rules from core application logic, which also makes maintenance and future scaling easier.

Additionally, businesses can modify and adapt the workflow to changing requirements or user-specific scenarios by putting in place a dynamic rules-loading system and providing administrative interfaces for controlling rules. In addition to improving user experience and operational efficiency, this guarantees that the application remains responsive to evolving requirements and regulatory changes.

In the end, this strategy not only gives financial institutions the opportunity to automate and streamline decision-making procedures, but it also permits increased control, transparency, and auditability—all of which are essential for upholding compliance and confidence in the heavily regulated financial sector.

HostForLIFE ASP.NET Core Hosting

European Best, cheap and reliable ASP.NET hosting with instant activation. HostForLIFE.eu is #1 Recommended Windows and ASP.NET hosting in European Continent. With 99.99% Uptime Guaranteed of Relibility, Stability and Performace. HostForLIFE.eu security team is constantly monitoring the entire network for unusual behaviour. We deliver hosting solution including Shared hosting, Cloud hosting, Reseller hosting, Dedicated Servers, and IT as Service for companies of all size.

 



European ASP.NET Core Hosting - HostForLIFE :: The .NET Build Tools 8.0.0 to 8.0.11 Breaking Changes

clock January 15, 2025 06:16 by author Peter

Builds and applications stopped working when I upgraded to.NET 8.0.11, and I began to receive errors. I was seeing errors like "error MSB4018: …" and "hostpolicy.dll...not found." I was unable to locate singlefilehost.exe.

1. Problem description
Build project settings all worked well somewhere around .NET 8.0.0. Later, with the upgrade of .NET runtime to later versions of .NET 8.0 and .NET 9.0 and an upgrade to Visual Studio, some of the projects stopped working. It looks like they introduced breaking changes in the build tools. Logic is still sound, and build types are the same; just the build tools started to behave a bit differently. New build configurations and build scripts are needed. I think I can locate the change in behavior somewhere between (.NET Framework 8.0.0/.NET SDK 8.0.100) and (.NET Framework 8.0.11/.NET SDK 8.0.404). Not all, but some project builds failed.

1.1. The environment

The typical environment to which this article applies is C#/VS2022.

.NET version 8.0.11 or later
And you are building project type SelfContained or SIngleFile.

1.2. Problem manifestation
You get Errors/Exceptions

  • The library 'hostpolicy.dll' required to execute the application was not found.
  • error MSB4018: …. Could not find file ….. singlefilehost.exe.

+++Error1, When running the application:++++++++++++++++++++

A fatal error was encountered. The library 'hostpolicy.dll' required to execute the application
was not found in 'C:\Program Files\dotnet\'.
Failed to run as a self-contained app.
  - The application was run as a self-contained app because
  'C:\tmpNetBundle\BundleExample02_NET90\ConsoleApp2C\
  SelfContained_SingleFile_win-x64\ConsoleApp2C.runtimeconfig.json'
  was not found.
  - If this should be a framework-dependent app, add the 'C:\tmpNetBundle\BundleExample02_NET90\ConsoleApp2C\
  SelfContained_SingleFile_win-x64\ConsoleApp2C.runtimeconfig.json'
  file and specify the appropriate framework.

PS C:\tmpNetBundle\BundleExample02_NET90\ConsoleApp2C\
SelfContained_SingleFile_win-x64>

+++Error2, During build++++++++++++++++++++

error MSB4018: The "GenerateBundle" task failed unexpectedly.
[C:\tmpNetBundle\BundleExample01_NET_8.0.0_SDK_8.0.100\ConsoleApp2\ConsoleApp2.csproj]
error MSB4018: System.IO.FileNotFoundException: Could not find file
'C:\tmpNetBundle\BundleExample01_NET_8.0.0_SDK_8.0.100\ConsoleApp2\
obj\Release\net8.0-windows\win-x64\singlefilehost.exe'.


1.3. Cause of problem and resolution
It looks like the flag <PublishSingleFile>true</PublishSingleFile> in the project file .csproj stopped to work in some cases. I was relying on that flag in my build scripts after that. No problem, we can anticipate that thing, just when we know what to expect.

It looks like the build process invoked “dotnet publish” from .NET SDK 9.* for projects that I was building for .NET 8.* framework. So, I decided to use a global.json file to explicitly specify which SDK I want to use.

2. Code Samples
These are old build settings that worked in NET_8.0.0/SDK_8.0.100 but stopped working in later versions.
// NET_8.0.0/SDK_8.0.100
// NOTE: These project settings all worked well somewhere around .NET 8.0.0.
// Later, with the upgrade of .NET runtime to later versions of .NET 8.0 and .NET 9.0
// and an upgrade to Visual Studio, some of projects stopped working. It looks like
// they introduced breaking changes in the build tools. Logic is still sound and build
// types are the same, just the build tools started to behave a bit differently. A new
// build configurations and build scripts are needed.

<!--ConsoleApp2C.csproj +++++++++++++++++++++++++++++++++++++-->
<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net8.0-windows</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
        <PlatformTarget>x64</PlatformTarget>
        <Platforms>AnyCPU;x64</Platforms>
        <RuntimeIdentifier>win-x64</RuntimeIdentifier>
        <DebugType>embedded</DebugType>
        <PublishSingleFile>true</PublishSingleFile>
        <PublishTrimmed>true</PublishTrimmed>
        <IsTrimmable>true</IsTrimmable>
        <SelfContained>true</SelfContained>
        <IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>
        <EnableCompressionInSingleFile>true</EnableCompressionInSingleFile>
    </PropertyGroup>

    <ItemGroup>
        <ProjectReference Include="..\ClassLibrary1\ClassLibraryA.csproj" />
    </ItemGroup>

    <Target Name="PostBuild" AfterTargets="PostBuildEvent">
        <Exec Command="echo +++Post-Build+++++&#xD;&#xA;
        if $(ConfigurationName) == Debug (
        &#xD;&#xA;echo +++++Debug+++++                    &#xD;&#xA;) &#xD;&#xA;&#xD;&#xA;
        if $(ConfigurationName) == Release (&#xD;&#xA;
        echo +++++SelfContained_SingleFile_win-x64.cmd+++++    &#xD;&#xA;
        call SelfContained_SingleFile_win-x64.cmd         &#xD;&#xA;
        echo +++++SelfContained_SingleFile_win-x64_Trimmed.cmd+++++    &#xD;&#xA;
        call SelfContained_SingleFile_win-x64_Trimmed.cmd         &#xD;&#xA;)    " />
    </Target>

</Project>

+++++Script: SelfContained_SingleFile_win-x64.cmd
dotnet publish ConsoleApp2C.csproj --no-build --runtime win-x64 --configuration Release
   -p:PublishSingleFile=true -p:SelfContained=true -p:PublishReadyToRun=false
   -p:PublishTrimmed=false --output ./SelfContained_SingleFile_win-x64

+++++Script: SelfContained_SingleFile_win-x64_Trimmed.cmd
dotnet publish ConsoleApp2C.csproj --no-build --runtime win-x64 --configuration Release
   -p:PublishSingleFile=true -p:SelfContained=true -p:PublishReadyToRun=false
   -p:PublishTrimmed=true --output ./SelfContained_SingleFile_win-x64_Trimmed


These are new build settings that work in NET_8.0.11/SDK_8.0.404.
// NET_8.0.11/SDK_8.0.404

<!--ConsoleApp2C.csproj +++++++++++++++++++++++++++++++++++++-->
<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net8.0-windows</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
        <PlatformTarget>x64</PlatformTarget>
        <Platforms>AnyCPU;x64</Platforms>
        <RuntimeIdentifier>win-x64</RuntimeIdentifier>
        <DebugType>embedded</DebugType>
        <PublishSingleFile>true</PublishSingleFile>
        <PublishTrimmed>true</PublishTrimmed>
        <IsTrimmable>true</IsTrimmable>
        <SelfContained>true</SelfContained>
        <IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>
        <EnableCompressionInSingleFile>true</EnableCompressionInSingleFile>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.0" />
    </ItemGroup>

    <ItemGroup>
        <ProjectReference Include="..\ClassLibrary1\ClassLibraryA.csproj" />
    </ItemGroup>

    <Target Name="RunAfterBuild1" AfterTargets="Build">
        <Exec Command="call SelfContained_SingleFile_win-x64.cmd"
        Condition=" '$(BuildingInsideVisualStudio)' == 'true' "/>
    </Target>

    <Target Name="RunAfterBuild2" AfterTargets="Build">
        <Exec Command="call SelfContained_SingleFile_win-x64_Trimmed.cmd"
        Condition=" '$(BuildingInsideVisualStudio)' == 'true' "/>
    </Target>

</Project>

+++++Script: SelfContained_SingleFile_win-x64.cmd
echo .NET SDK version:
dotnet --version
dotnet publish ConsoleApp2C.csproj --nologo --no-restore --runtime win-x64
--configuration Release   -p:PublishSingleFile=true -p:SelfContained=true
-p:PublishReadyToRun=false  -p:PublishTrimmed=false
--output ./SelfContained_SingleFile_win-x64

+++++Script: SelfContained_SingleFile_win-x64_Trimmed.cmd
echo .NET SDK version:
dotnet --version
dotnet publish ConsoleApp2C.csproj --nologo --no-restore --runtime win-x64
 --configuration Release   -p:PublishSingleFile=true -p:SelfContained=true
 -p:PublishReadyToRun=false  -p:PublishTrimmed=true
 --output ./SelfContained_SingleFile_win-x64_Trimmed

+++++Configfile: global.json
{
  "sdk": {
    "version": "8.0.404"
  }
}

These are new build settings that work in NET_9.0.0/SDK_9.0.101.
// NET_9.0.0/SDK_9.0.101

<!--ConsoleApp3C.csproj +++++++++++++++++++++++++++++++++++++-->
<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net9.0-windows7.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
        <PlatformTarget>x64</PlatformTarget>
        <Platforms>AnyCPU;x64</Platforms>
        <RuntimeIdentifier>win-x64</RuntimeIdentifier>
        <DebugType>embedded</DebugType>
        <PublishSingleFile>true</PublishSingleFile>
        <PublishTrimmed>true</PublishTrimmed>
        <IsTrimmable>true</IsTrimmable>
        <SelfContained>true</SelfContained>
        <PublishReadyToRun>true</PublishReadyToRun>
        <IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>
        <EnableCompressionInSingleFile>true</EnableCompressionInSingleFile>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.0" />
    </ItemGroup>

    <ItemGroup>
        <ProjectReference Include="..\ClassLibrary1\ClassLibraryA.csproj" />
    </ItemGroup>

    <Target Name="RunAfterBuild1" AfterTargets="Build">
        <Exec Command="call SelfContained_SingleFile_win-x64_ReadyToRun.cmd"
        Condition=" '$(BuildingInsideVisualStudio)' == 'true' " />
    </Target>

    <Target Name="RunAfterBuild2" AfterTargets="Build">
        <Exec Command="call SelfContained_SingleFile_win-x64_Trimmed_ReadyToRun.cmd"
        Condition=" '$(BuildingInsideVisualStudio)' == 'true' " />
    </Target>

</Project>

+++++Script: SelfContained_SingleFile_win-x64_ReadyToRun.cmd
echo .NET SDK version:
dotnet --version
dotnet publish ConsoleApp3C.csproj --nologo --no-restore --runtime win-x64
--configuration Release   -p:PublishSingleFile=true -p:SelfContained=true
-p:PublishTrimmed=false -p:PublishReadyToRun=true
--output ./SelfContained_SingleFile_win-x64_ReadyToRun

+++++Script: SelfContained_SingleFile_win-x64_Trimmed_ReadyToRun.cmd
echo .NET SDK version:
dotnet --version
dotnet publish ConsoleApp3C.csproj --nologo --no-restore --runtime win-x64
--configuration Release   -p:PublishSingleFile=true -p:SelfContained=true
-p:PublishReadyToRun=true  -p:PublishTrimmed=true
--output ./SelfContained_SingleFile_win-x64_Trimmed_ReadyToRun

+++++Configfile: global.json
{
  "sdk": {
    "version": "9.0.101"
  }
}

HostForLIFE ASP.NET Core Hosting

European Best, cheap and reliable ASP.NET hosting with instant activation. HostForLIFE.eu is #1 Recommended Windows and ASP.NET hosting in European Continent. With 99.99% Uptime Guaranteed of Relibility, Stability and Performace. HostForLIFE.eu security team is constantly monitoring the entire network for unusual behaviour. We deliver hosting solution including Shared hosting, Cloud hosting, Reseller hosting, Dedicated Servers, and IT as Service for companies of all size.



European ASP.NET Core Hosting - HostForLIFE :: Moq Unit Testing in .NET Core with xUnit

clock January 6, 2025 07:21 by author Peter

The smallest steps in the software development process are tested using a software design pattern known as unit testing. Unit testing is used to verify functionality and produce expected results before the QA Team and production environment proceed. It is advantageous to identify issues early in the software development cycle.

NUnit, xUnit, and numerous additional unit test tools are included with the.NET Framework.

xUnit
For .NET development, xUnit is a free and open-source unit testing framework. There are numerous features in xUnit that make it easier to write clear and effective unit test cases. It offers a mechanism to create our own attributes in addition to numerous attributes, such as fact, theory, and many more, to help write test cases clearly and efficiently.

Features of the xUnit

  • xUnit in.NET uses the [Fact] attribute to specify the unit test method.
  • The test procedure's parameters are provided by the [Theory] attribute.

Creating a Testing Project
At last, we reach the stage where our tests will require the creation of a new project. We will take advantage of the handy xUnit testing project template that comes with Visual Studio 2022 when we use it. An open-source unit testing tool for the.NET framework called xUnit makes testing easier and frees up more time to concentrate on creating tests.

Moq
Fundamentally, the mocking library is called Moq.
If our application depends on one or more services, we can use the Moq library to mock certain classes and functionality using fake data instead of having to initialize everything associated with it.

Write some more unit tests, please! As you can see, the interface is being injected into our controller via Dependency Injection. Thus, through that injected interface, our controller is essentially dependent on the repository logic. That method is also highly advised and has no issues at all. However, we should isolate those dependencies when writing tests for our controller or any other class in a project.

The following are some benefits of dependency isolation in test code.

  • Our test code is significantly simpler because we don't need to initialize every dependency in order to return accurate values.
  • If our test fails and we don't isolate the dependency, we won't know if the failure was caused by a controller error or by the dependency itself.
  • Test code may run more slowly when dependent code interacts with an actual database, as our repository does. This may occur as a result of poor connections or just taking too long to retrieve data from the database.

You get the idea, though there are more justifications for isolating dependencies in test code.

Having said that, let's add the Moq library to the project Tests.

Install-Package Moq

OR

We are now prepared to write tests for our EmpController's first GetAll method.

The xUnit framework uses the [Fact] attribute, which we will use to decorate test methods to identify them as the real testing methods. In the test class, in addition to the test methods, we can have an infinite number of helper methods.

The AAA principle (Arrange, Act, and Assert) is typically followed when writing unit tests.

  • Arrange: this is the part where you usually get everything ready for the test or put another way, you get the scene ready for the test (making the objects and arranging them as needed).
  • Act: Here is where the procedure that we are testing is carried out.
  • Assert: In this last section of the test, we contrast the actual outcome of the test method's execution with our expectations.

Testing Our Actions
We will want to confirm the following in the Get method, which is the first method we are testing.

  • Whether the method yields the OkObjectResult, a response code of 200 for an HTTP request.
  • Whether the returned object includes every item in our list of Emps.

Testing the GET Method
using Microsoft.AspNetCore.Mvc;
using Moq;
using System.Linq.Expressions;
using WebApplication1.Contract;
using WebApplication1.Controllers;
using WebApplication1.Database;
using WebApplication1.Model;
using WebApplication1.Repository;

namespace TestDemo
{
    public class EmpControllerTest
    {
        private readonly EmpController _empController;
        private readonly Mock<IEmpRepository> _empRepository;

        public EmpControllerTest()
        {
            _empRepository = new Mock<IEmpRepository>();
            _empController = new EmpController(_empRepository.Object);
        }

        [Fact]
        public void GetAll_Success()
        {
            // Arrange
            var expectedResult = GetEmps().AsQueryable();
            _empRepository.Setup(x => x.GetAll(It.IsAny<FindOptions>())).Returns(expectedResult);

            // Act
            var response = _empController.Get();

            // Assert
            Assert.IsType<OkObjectResult>(response as OkObjectResult);
        }
    }
}

[Theory]
[InlineData("503df499-cabb-4699-8381-d76917365a9d")]
public void GetById_NotFound(Guid empId)
{
    // Arrange
    Emp? emp = null;
    _empRepository
        .Setup(x => x.FindOne(It.IsAny<Expression<Func<Emp, bool>>>(), It.IsAny<FindOptions?>()))
        .Returns(emp!);

    // Act
    var response = _empController.Get(empId);

    // Assert
    Assert.IsType<NotFoundObjectResult>(response as NotFoundObjectResult);
}

In case all of the unit test cases are passed, then it looks like the screenshot below.

In case any of the unit test cases fail, then it looks like the screenshot below.

Together, we evolved after learning the new method. Have fun with your coding!

HostForLIFE ASP.NET Core Hosting

European Best, cheap and reliable ASP.NET hosting with instant activation. HostForLIFE.eu is #1 Recommended Windows and ASP.NET hosting in European Continent. With 99.99% Uptime Guaranteed of Relibility, Stability and Performace. HostForLIFE.eu security team is constantly monitoring the entire network for unusual behaviour. We deliver hosting solution including Shared hosting, Cloud hosting, Reseller hosting, Dedicated Servers, and IT as Service for companies of all size.



About HostForLIFE

HostForLIFE is European Windows Hosting Provider which focuses on Windows Platform only. We deliver on-demand hosting solutions including Shared hosting, Reseller Hosting, Cloud Hosting, Dedicated Servers, and IT as a Service for companies of all sizes.

We have offered the latest Windows 2019 Hosting, ASP.NET 5 Hosting, ASP.NET MVC 6 Hosting and SQL 2019 Hosting.


Month List

Tag cloud

Sign in