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 8.0.1 Hosting - HostForLIFE :: Create a Custom Wait Loader in .NET MAUI

clock February 26, 2024 08:24 by author Peter

Within MAUI, a loading indication, often known as a "wait loader," is commonly used to alert the user of an ongoing time-consuming action, such as data collection, processing, or any operation that may cause the UI to become unresponsive or freeze.

Loading screen addresses various issues
Typically, a loading screen addresses various issues.

1. Visual Indication
Objective: Provide a visual indication to users that a task is currently being executed.
Significance: Users appreciate being informed that their action has been recognized and that the application is actively working on fulfilling their request.

2. User Interaction
Objective: Engage users during operations that may take some time.
Significance: A loader ensures that users do not feel like the application has frozen or stopped responding. It assures them that background processes are ongoing.

3. Managing Expectations
Objective: Clearly communicate the expected duration of a process.
Significance: Users are more likely to wait patiently if they have an estimate of how long the process will take. A loader helps manage expectations and reduces the perceived waiting time.

4. Restricting User Input
Objective: Limit or disable user interactions while a process is ongoing.
Significance: Restricting user input during a process helps prevent unexpected behavior or errors that could occur due to user actions at that time.

5. Displaying Progress
Objective: Show progress if the duration of the process is known.
Significance: In cases where the duration of a process is predictable, a loader can display progress, giving users an idea of the work completed and the remaining tasks.

The issue of a waiting loader with specific features can be resolved by utilizing the nuget package called "Custom.MAUI.AnimatedLoaders". As the proprietor of this package, I am pleased to provide the following features to the users.

1. mauiWaitLoaderColor: Color.FromArgb("#FF0000")
This feature allows the user to specify the color of the MAUI wait loader. By setting the color to red (#FF0000), the loader will be displayed in a vibrant red hue. The Color.FromArgb method is employed to create a color object based on an ARGB (Alpha, Red, Green, Blue) value.

2. loaderTextColor: Color.FromArgb("#FFFFFF")
This feature enables the user to determine the color of the text within the loader. By setting the color to white (#FFFFFF), the text will be displayed in a crisp white shade.

3. loaderHeightRequest: 150.0
With this feature, the user can set the height of the loader to 150.0 device-independent pixels (DIP). This ensures that the loader is displayed at the desired height on various devices.

4. loaderWidthRequest: 150.0
Similarly, this feature allows the user to set the width of the loader to 150.0 device-independent pixels (DIP). It ensures that the loader occupies the desired width on different devices.

5. loaderFontSize: 16.0
This feature enables the user to specify the font size of the loader text. By setting it to 16.0 device-independent pixels (DIP), the text will be displayed at the desired font size.

6. message: "Processing"
Lastly, this feature allows the user to define the message that will be displayed alongside the custom loader. In this case, the message is set to "Processing", indicating that some form of processing is taking place.

Please note that these features are provided within the "Custom.MAUI.AnimatedLoaders" nuget package, which I am the proprietor of.
Steps to implement custom loader in MAUI

The user has to follow the following steps to implement a custom loader in MAUI.

Step 1. To incorporate the functionality of "Custom.MAUI.AnimatedLoaders" into your project, you need to install the corresponding NuGet package.

Step 2. The initial configuration for the MAUI loader will resemble this.

using MAUI.Custom.LoaderEase;

namespace CustomMAUIAnimatedLoadersExample
{
    public partial class App : Application
    {
        public App()
        {
            InitializeComponent();

            // MAUI LOADER INITIAL SETUP
            MAUILoaderRegisterationSetup.ConfigureCustomMAUILoader(
                mauiWaitLoaderColor: Color.FromArgb("#FF0000"),
                loaderTextColor: Color.FromArgb("#FFFFFF"),
                loaderHeightRequest: 150.0,
                loaderWidthRequest: 150.0,
                loaderFontSize: 16.0
            );

            MainPage = new AppShell();
        }
    }
}

Step 3. Register the MAUICommunityToolkit in order to execute this loader.
using CommunityToolkit.Maui;
using MAUI.Custom.LoaderEase.AppPresentations.CommonSource;
using MAUI.Custom.LoaderEase.AppPresentations.Services;
using MAUI.Custom.LoaderEase.Interfaces;
using Microsoft.Extensions.Logging;

namespace CustomMAUIAnimatedLoadersExample
{
    public static class MauiProgram
    {
        public static MauiApp CreateMauiApp()
        {
            try
            {
                var builder = MauiApp.CreateBuilder();
                builder.UseMauiApp<App>().ConfigureFonts(fonts =>
                {
                    fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                    fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
                });
                RegisterEssentials(builder.Services);
                RegisterPages(builder.Services);
                RegisterViewModels(builder.Services);
                builder.UseMauiCommunityToolkit(); // Registering for MAUI loader
                var app = builder.Build();
                MauiServiceHandler.MauiAppBuilder = app;
                return app;
            }
            catch (Exception ex)
            {
                return null;
            }
        }

        static void RegisterPages(in IServiceCollection services)
        {
            services.AddTransient<MainPage>();
        }

        static void RegisterViewModels(in IServiceCollection services)
        {
            services.AddTransient<MainPageViewModel>();
        }

        static void RegisterEssentials(in IServiceCollection services)
        {
            // If the user intends to utilize this service through dependency injection,
            // they must register the loader service handler.
            services.AddSingleton<ICustomLoaderHandlerService, CustomLoaderHandlerService>();
        }
    }
}


Step 4. If the user intends to utilize this service through dependency injection, they must register the loader service handler.
static void RegisterEssentials(in IServiceCollection services)
{
    // If the user intends to utilize this service through dependency injection,
    // they must register the loader service handler.
    services.AddSingleton<ICustomLoaderHandlerService, CustomLoaderHandlerService>();
}

Step 5. Implement a custom loader call within the ViewModel using the MVVM pattern, whether through dependency injection or without the need to instantiate any objects.
using MAUI.Custom.LoaderEase.Interfaces;

namespace CustomMAUIAnimatedLoadersExample
{
    public class MainPageViewModel
    {
        private ICustomLoaderHandlerService loaderHandlerService = null;

        [Obsolete]
        public MainPageViewModel(ICustomLoaderHandlerService loaderHandlerService)
        {
            this.loaderHandlerService = loaderHandlerService;
            ShowWaitWindow();
            CloseLoader();
        }

        private void ShowWaitWindow()
        {
            // To display the loader using the Dependency Injection service.
            if (loaderHandlerService != null)
                loaderHandlerService.ShowCustomLoader(message: "Processing");

            // To display the loader without generating an instance.
            // LoaderHandler.ShowCustomLoader(message: "Searching", loaderType: LoaderType.QuantumQuikLoader);
        }

        [Obsolete]
        private void CloseLoader()
        {
            Device.StartTimer(TimeSpan.FromSeconds(20), () =>
            {
                // To hide the loader using the Dependency Injection service.
                loaderHandlerService.HideCustomLoader();

                // To hide the loader without generating an instance.
                // LoaderHandler.HideCustomLoader();

                return false;
            });
        }
    }
}


Step 6. View of wait loader.

 

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 8.0.1 Hosting - HostForLIFE :: Error Management in .NET Core

clock February 19, 2024 06:21 by author Peter

In software development, error handling is a critical component. The way a software handles errors, no matter how minor or large, can have a significant impact on how well it functions for users. One neat error-handling technique in the world of.NET Core is dubbed "global exception handling using custom middleware." It's like having a superhero for your code who finds bugs and fixes them all in one location, strengthening and enhancing the dependability of your application.

Comprehending Global Exception Management
In most.NET Core programs, try-catch blocks are used to encircle any code that may potentially cause issues. However, if we do this everywhere, our code may become jumbled and repetitious. This is resolved by global exception handling, which establishes a central system that detects faults wherever they occur.

Personalized Middleware

In.NET Core, the phrase "middleware" refers to a fancy manner of handling requests and responses in a web application. Custom middleware expands on this concept. It allows us to add custom code to the process, such as additional support to handle problems. This makes our code easier to read and more orderly.

Putting Custom Exception Middleware in Place
These steps must be followed in order to configure global exception handling in.NET Core utilizing custom middleware.
1. Create Custom Middleware: Write a unique piece of code, or middleware, to detect application issues.

public class ExceptionMiddleware
{
    private readonly RequestDelegate _next;

    public ExceptionMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            // Here we handle the error
            await HandleExceptionAsync(context, ex);
        }
    }

    private async Task HandleExceptionAsync(HttpContext context, Exception ex)
    {
        // Handle the error and let the user know
        // Respond with a message saying something went wrong
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
        await context.Response.WriteAsync("An unexpected error occurred.");
    }
}

2. Register Middleware: Tell the application to use our special middleware to handle errors.
public void Configure(IApplicationBuilder app)
{
    app.UseMiddleware<ExceptionMiddleware>();
    // More configurations can go here...
}

Custom Exception Middleware's advantages
In.NET Core, there are several excellent benefits to using custom middleware for global exception handling.

Centralized Management of Errors

Because all error handling is done in one location, managing and comprehending the code is made simpler. Consistent Error Responses: Ensure that the user always receives the same type of message when something goes wrong, so that both they and us can identify the issue. More robust applications Our apps become more dependable and capable of handling issues without crashing when they handle errors gracefully.

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 8.0.1 Hosting - HostForLIFE :: What Does Profiling and Monitoring Mean?

clock February 12, 2024 08:07 by author Peter

In order to comprehend and improve the performance of their applications, developers can benefit greatly from the use of monitoring and profiling in software development and maintenance. Let's investigate profiling and monitoring inside the framework of web apps, with an emphasis on Angular applications specifically.

Observing
Monitoring of Angular Performance

Angular Performance Explorer is an integrated tool that comes with Angular.

Some popular tools include.

1. Explorer of Angular Performance
Angular Performance Explorer is an integrated tool that comes with Angular. This tool gives you information on how well Angular components, directives, and services are performing. It can be accessed using the developer tools in your browser. It's also useful to you.

Examine how long the lifecycle hooks for each component take.
Examine the cycles of change detection and locate any possible bottlenecks.
Track the duration of each component's rendering.

To access the Angular Performance Explorer

Open Chrome DevTools (F12 or right-click and select "Inspect").
Navigate to the "Performance" tab.
Click on the "Angular" sub-tab.

2. Google Chrome DevTools

Google Chrome DevTools offers a powerful set of tools for monitoring and debugging Angular applications. The "Performance" tab within DevTools allows you to.

Record and analyze runtime performance.
Identify CPU and memory usage.
Understand the timeline of events during a user interaction or page load.

To use Chrome DevTools for Angular performance monitoring.

Open Chrome DevTools (F12 or right-click and select "Inspect").
Navigate to the "Performance" tab.
Record a performance profile by clicking the red circle.
Perform the desired actions in your Angular application.
Stop the recording by clicking the red square.

3. Real User Monitoring (RUM) Tools

Consider using Real User Monitoring (RUM) tools such as New Relic, Datadog, or others. These tools provide insights into how real users are experiencing your Angular application, including page load times, AJAX requests, and user interactions. Integrating RUM tools typically involves adding a monitoring script to your application, which then sends performance data to the chosen monitoring service.

Logging and Error Tracking

Logging and error tracking are essential components of any application's monitoring and maintenance strategy. They help developers identify issues, troubleshoot problems, and improve overall application stability. In the context of Angular applications, here are some strategies for logging and error tracking:
Logging in Angular

1. Console Logging

Angular applications can utilize standard console logging for debugging purposes. You can use console.log(), console. warn(), and console.error() statements to output information to the browser's console.

// Example component with console logging
@Component({
selector: 'app-example',
template: '<p>Example Component</p>',
})
export class ExampleComponent implements OnInit {
ngOnInit() {
console.log('Component initialized');
}
}

3. Angular Logging Services

For more sophisticated logging, consider using third-party logging libraries or services. Popular ones include.

Angular Logger Service: A custom logging service that can be injected into Angular components and services.
Ngx Logger: A configurable logging service for Angular applications.

Error Tracking

1. Global Error Handling
Implement a global error handler to catch unhandled errors throughout your Angular application. You can use the ErrorHandler service provided by Angular to customize error handling.
// Example global error handler
@Injectable()
export class GlobalErrorHandler implements ErrorHandler {
handleError(error: any): void {
// Handle the error (e.g., log it, send to an error tracking service)
console.error('Global error handler:', error);
}
}


In your AppModule, provide this error handler.
@NgModule({
providers: [
{ provide: ErrorHandler, useClass: GlobalErrorHandler },
],
})
export class AppModule { }


2. Third-Party Error Tracking Services
Integrate third-party error tracking services to monitor and receive alerts about errors in your application. Popular services include.

Sentry: A platform for real-time error tracking and monitoring.
Rollbar: A cloud-based error tracking and monitoring service.
Bugsnag: A tool for detecting and diagnosing application errors.

To integrate Sentry, for example, you would typically install the Sentry package and configure it in your Angular application.

npm install @sentry/angular @sentry/tracing

// Import and configure Sentry in your AppModule
import { SentryModule } from '@sentry/angular';
import { Integrations } from '@sentry/tracing';

Sentry.init({
dsn: 'YOUR_DSN',
integrations: [
new Integrations.BrowserTracing(),
],
});

@NgModule({
imports: [SentryModule],
})
export class AppModule { }


Logging and Error Tracking Best Practices

Environment-Specific Configuration: Configure logging and error tracking differently based on the environment (development, staging, production). For example, you might want more verbose logging in development but less in production.
Include Context Information: When logging or tracking errors, include relevant context information such as user details, browser version, and the application's state.
Security Considerations: Ensure that sensitive information is not exposed in logs or error reports. Be mindful of data privacy and security concerns.
Regular Monitoring: Regularly review logs and error reports to identify patterns, trends, and potential areas for optimization.
Continuous Improvement: Iteratively improve logging and error tracking based on the insights gained from monitoring and analysis.

Profiling
Profiling is the process of analyzing and measuring various aspects of a program's performance to identify bottlenecks, optimize resource usage, and improve overall efficiency. In the context of Angular applications, profiling can help developers understand how the application behaves and where performance improvements can be made. Here are some profiling techniques and tools for Angular.
Angular Profiler

Angular itself provides a built-in profiler that can be enabled using the Angular CLI. This profiler offers insights into change detection, rendering, and other Angular-specific metrics.

To enable the Angular profiler, you can use the following command when starting your Angular application.
ng serve --profile

This enables the Angular profiler, which provides additional information about change detection, rendering, and other performance-related metrics.
Chrome DevTools

1. Performance Tab
Chrome DevTools is a powerful set of tools for debugging and profiling web applications. The "Performance" tab in Chrome DevTools allows you to record and analyze runtime performance, CPU usage, memory allocation, and other metrics.

To use the Performance tab.

  • Open Chrome DevTools (F12 or right-click and select "Inspect").
  • Navigate to the "Performance" tab.
  • Record a performance profile by clicking the red circle.
  • Perform the desired actions in your Angular application.
  • Stop the recording by clicking the red square.

2. Memory Tab
The "Memory" tab in Chrome DevTools helps you analyze memory usage in your application. It can be useful for identifying memory leaks and optimizing memory consumption.
Augury

Angury is a Chrome and Firefox DevTools extension specifically designed for debugging and profiling Angular applications. It provides additional insights into the structure, state, and performance of your Angular application.

To use Augury

Install the Augury extension from the Chrome Web Store or Firefox Add-ons.
Open Chrome DevTools or Firefox Developer Tools.
Navigate to the "Augury" tab.

Web Performance Testing

1. Lighthouse
Lighthouse is an open-source, automated tool for improving the quality of web pages. It has audits for performance, accessibility, progressive web apps, SEO, and more.

You can run Lighthouse from the Chrome DevTools or use the Lighthouse CLI to perform audits on your Angular application.
# Install Lighthouse globally
npm install -g lighthouse

# Run Lighthouse on your Angular app
lighthouse http://localhost:4200


Webpack Bundle Analyzer
If you want to analyze the size of your application bundles, you can use tools like Webpack Bundle Analyzer. This tool visualizes the size of your bundles and dependencies, helping you identify areas for optimization.
# Install Webpack Bundle Analyzer
npm install --save-dev webpack-bundle-analyzer


Then, add a script in your package.json to run the analyzer
"scripts": {
"analyze": "webpack-bundle-analyzer dist/your-app-name/stats.json"
}


Run the script after building your Angular application.
npm run build -- --prod
npm run analyze


Profiling tools and techniques are essential for identifying performance bottlenecks and optimizing Angular applications. Regularly profile your application, especially during development and before deploying to production, to ensure optimal performance.

Best Practices
1. Code Splitting: Implement code splitting to reduce the initial load time of your Angular application. This involves breaking your application into smaller modules that are loaded on demand.
2. Lazy Loading: Take advantage of Angular's lazy loading feature to load modules only when they are needed, improving the initial page load time.
3. Optimize Change Detection: Angular's change detection can be resource-intensive. Optimize it by using the OnPush change detection strategy and avoiding unnecessary triggers.
4. Bundle Optimization: Configure your build tools (such as Angular CLI or Webpack) to optimize and minify your application bundles for production. This reduces the overall size of your application, improving load times.
5. Caching Strategies: Implement proper caching strategies for assets and API calls to reduce the number of network requests and improve the overall performance of your application.
6. Performance Budgets: Set performance budgets to establish acceptable thresholds for metrics like page load time, bundle size, and other critical performance indicators.
7. Continuous Monitoring: Implement continuous monitoring practices to catch performance issues early in development and production. This can include automated tests, performance regression testing, and monitoring tools integrated into your CI/CD pipeline.

By combining monitoring and profiling techniques with best practices, you can ensure that your Angular application is not only performant but also maintainable and scalable. Regularly revisit and adjust your strategies as your application evolves to keep it optimized over time.

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 8.0.1 Hosting - HostForLIFE :: .Net MAUI Community Toolkit Popup Implementation

clock February 5, 2024 07:05 by author Peter

I'll go over how to construct a.NET MAUI Popup page with Visual Studio 2022 in this tutorial. Operating systems offer a mechanism to display a message and request a response from the user. These alerts are usually restricted in terms of the content a developer can provide as well as the layout and appearance. Popups are a very common way of presenting information to a user that relates to their current task.

Important

  • An exception will be raised when attempting to display your Popup if the code underlying the file is not generated concurrently with the call to InitializeComponent.
  • Only a Page or an implementation that derives from a Page may display a Popup.

Take note

  • It will finish and return to the calling thread before the operating system dismisses the Popup from the screen since Close() is a fire-and-forget procedure. Use CloseAsync() in its place if you need to stop your code from running until the operating system has removed the Popup from the screen.
  • The ResultWhenUserTapsOutsideOfPopup property allows you to modify the value that is returned in order to handle tapping outside of a Popup while also waiting for the outcome.
  • Make sure to specify the ApplyToDerivedTypes property on the Style definition when establishing a style that targets Popup if you want it to apply to custom popups, such as the SimplePopup example.

Step 1: Open Visual Studio 2022, create a new project, and choose the app option under the multiplatform section on the left side panel. Next, Select the.NET MAUI App with C# option and press the continue button.

Step 2: You must choose the.Net framework version 6.0 and press the proceed button on the following screen.

Step 3: Click the Create button after entering your location, the name of your project, and the name of your solution on the following screen.

Step 4: The NuGet Package CommunityToolkit needs to be downloaded.The MauiProgram.cs file needs to be configured for Maui and CommunityToolkit.
The Community Toolkit can be downloaded using NuGet Package Manager.

dotnet add package CommunityToolkit.Maui --version 7.0.1

2. Configure CommunityToolKit in MauiProgram.cs.
using Microsoft.Extensions.Logging;
using CommunityToolkit.Maui;

namespace Popup
{
    public static class MauiProgram
    {
        public static MauiApp CreateMauiApp()
        {
            var builder = MauiApp.CreateBuilder();

            builder
                .UseMauiApp<App>()
                .UseMauiCommunityToolkit()
                .ConfigureFonts(fonts =>
                {
                    fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                    fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
                });

#if DEBUG
            builder.Logging.AddDebug();
#endif

            return builder.Build();
        }
    }
}


Step 5. The next step is to create the new content page and define the Community Popup view In order to use the toolkit in XAML the following xmlns need to be added to your page or view.
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"

Therefore, the following
<?xml version="1.0" encoding="utf-8" ?>
<mct:Popup xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
           xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
           xmlns:mct="clr-namespace:CommunityToolkit.Maui.Views;assembly=CommunityToolkit.Maui"
           x:Class="Popup.MainPage"
           CanBeDismissedByTappingOutsideOfPopup="False"
           Size="300, 300">

    <Border VerticalOptions="CenterAndExpand"
            HorizontalOptions="CenterAndExpand"
            Stroke="White"
            StrokeThickness="1"
            StrokeShape="RoundRectangle 10">

        <VerticalStackLayout VerticalOptions="CenterAndExpand" Spacing="20">

            <Label Text="Welcome to .NET MAUI!"
                   VerticalOptions="Center"
                   HorizontalOptions="Center" />

            <Button Text="Close" Clicked="Button_Clicked" />

        </VerticalStackLayout>

    </Border>
</mct:Popup>


Step 6. The next step is to call the Popup from Main Page event or initialization and A Popup can only be displayed from a Page or an implementation inheriting from Page.
using CommunityToolkit.Maui.Views;

namespace Popup
{
    public partial class FirstPage : ContentPage
    {
        public FirstPage()
        {
            InitializeComponent();
        }

        private void OnCounterClicked(object sender, EventArgs e)
        {
            this.ShowPopup(new MainPage());
        }
    }
}


Output screen

With any luck, this post has provided you with enough knowledge to use viewmodel to design an MAUI collection view and execute the application on both iOS and Android. Please feel free to leave a comment if you would like me to go into further detail on anything I've covered in this post.

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