Base solution for your next web application

Activities of "daws"

Hey ! :)

I've a question about a specific architecture. I have to add 2 new features :

  • <ins>Memory cache accessible by WebAPI AND filled by a network connection</ins>

My goal is to have WebAPIs to retrieve DB stuff (already done) AND WebAPIs to retrieve infos from a realtime cache. I will NOT use SignalR for this part (for performance reason, i'll call webapi once each 5 minutes instead of receiving signalR datas each second) My realtime is delayed with 5-10 minutes, so it's not a problem.

This cache is not coming from DB but from a memory cache (list object) which is filled each second by a tcp stream.

Knowing that WebAPI IIS are initialized when called, i can't run a tcp service on IIS.

  • <ins>SignalR</ins>

I just need to create an windows service for that. (like you explained on <a class="postlink" href="https://github.com/aspnetboilerplate/aspnetboilerplate/issues/174">https://github.com/aspnetboilerplate/as ... issues/174</a> )

I see multiple solutions here for the memory cache :

  • <ins>Encapsulate my tcp service & WebAPIs TCP in a windows service.</ins>I create a separated windows service which SELF HOST webAPIs TCP and signalR In this way [list:i7cspscg] [*:i7cspscg]Current project (WebAPIs DB & Web) still works in the same process ISS
  • WebAPIs TCP are SELF HOSTED in a windows service & contains SignalR Hub also.

[/:m:i7cspscg] [:i7cspscg]<ins>Split the current project (WebAPI & Web) into 2 distinct process.</ins>

  • Web Project on IIS
  • ALL WebAPI (ABP DB & TCP) on a SELF HOSTED service. (with SignalR also)[/*:m:i7cspscg][/list:o:i7cspscg]
  • What do you think is the best solution ? (or another one ?)
  • [AbpAuthorize] is still going to work if webAPI is hosted on a different thread ? (Windows service vs Web IIS project)
  • To use ABPScripts WebAPI from different windows services (ports), do I simply include <script src="~/AbpScripts/GetScripts"> with the url & port from the specific service ?

Thks for your help !

Thks for the explaination regarding webapi & autorisation !

Indeed, your project using separated project looks interestring but a little bit more complex.

For the rest, I created a visio. Black : what's already done (default abp working process) <span style="color:#FF0000">Red : what I want to achieve. (forget about SignalR on schema)</span>

The main problem is how to inject data in "Cache in Memory" from a tcp service.

Is it possible to encapsulate all theses processes in one running IIS process ? (except the TCP/IP Server which is external of course)

I don't think so, due to the TCP service (explained in previous post)

  • if yes, any idea ?
  • if not ... what's the best solution ? split to a specific process (windows service) containing cache, specific WebAPI just for this DataLayer, TCP/IP client, SignalR hub ? (AngularJS connecting to these services)

Not related question to previous problem :

  • if I want to cache all retrieved Database datas from WebAPI calls (with same parameters), (knowing that DB data are not modified), is there something already conceived in ABP ? or should I implement custom repository with caches ? or put this cache in BusinessLayer ?

Great !

I successfully created a RealTimeManager (dll, specific module) which I can insert in ApplicationService (via constructor injection) And in PostInitialize Web Project via IIocResolver like you specified in your doc.

public override void PostInitialize()
        {
            using (var realtimeManager = IocManager.ResolveAsDisposable<RealTimeManager>())
            {
                realtimeManager.Object.SetValue(666666666);
            }
public class RealTimeManager : IRealTimeManager, ISingletonDependency

indeed, my process need to be connected to TCP 24h/24 365day/year, so i'll prevent IIS to sleep process.

thks for the big help !

I think that's not a best practice to inject a tcp listener 24h/24 without interruption in a IIS process; even if I successfuly did it like you said. (if I restart it each day, there can be a data loss)

I'll try the other practice, an Windows service containing tcp listener, WebAPI (specific port), & abp module zero integration.

for that, i struggle a little bit; i created a ConsoleApp with SelfAPI web host, which works fine. I try to integrate Abp into this project, but i can't get the WebAPI accessible from my browser.

I suppose that's because I need to inject routes into HttpSelfHostServer.

if it's that, do you know how to inject Dynamic routes from abp (DynamicApiControllerBuilder) into this config ? Thks !

using Abp;
using Abp.Application.Services;
using Abp.Modules;
using Abp.WebApi.Controllers.Dynamic.Builders;
using System;
using System.Reflection;
using System.Web.Http.SelfHost;

namespace ConsoleApplication3
{

    //#region AppService

    public interface IKartAppService : IApplicationService
    {
        int GetValue();
    }

    public class KartAppService : IKartAppService
    {
        public int GetValue()
        {
            return 5;
        }
    }

    //#endregion AppService


    public class Program
    {
        static void Main(string[] args)
        {
            using (var bootstrapper = new AbpBootstrapper())
            {
                bootstrapper.Initialize();

                var config = new HttpSelfHostConfiguration("http://localhost:8071");

                // TEST URL http://localhost:8071/api/services/test/kart/getValue
				
				// HOW TO inject Dynamic routes from abp (DynamicApiControllerBuilder) into this config ?
				
				                //config.Routes.MapHttpRoute(
                    //"API Default", "api/{controller}/{action}/{id}",
                    //new { id = RouteParameter.Optional });

                using (HttpSelfHostServer server = new HttpSelfHostServer(config))
                {
                    server.OpenAsync().Wait();
                    Console.WriteLine("Press Enter to quit.");
                    Console.ReadLine();
                }

            }
        }
    }

    public class TestAppModule : AbpModule
    {
        public override void Initialize()
        {
            IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());

            DynamicApiControllerBuilder
               .ForAll<IApplicationService>(Assembly.GetExecutingAssembly(), "test")
               .Build();
        }
    }
}

Indeed, TCP Server-Client communication must be fault-tolerant ;)

I already have implemented my own mecanism to retrieve data loss, based on a company logic. It's a custom mecanism; since tcp server can be from all over the world with shitty connections sometimes (asia -> EU). (FYI, each tcp server write its own sent flux in local files. I never loss data; if the flux is shut down, I can retrieve local files)

I could integrate this mecanism in my 1st solution (tcp client in IIS), but if it avoid me to call this mecanism each days (thks to a Windows service) ; i'll do it, for reliability purposes.

I had a look on RabbitMQ, quite interesting Framework.

Did you already had time to had a look on your related code parts ? :)

thks !

Answer

For info to hikalkan, I've also the same problem.

I've disabled the browser's cache on my DEV machine, so there is no problem. But for other machines, old cache still apply after switching language :)

I'm not sure to understand but if you want to use claims authorization on your webAPI calls, you should not inject [Authorize] on WebAPI Project but in each method of Services that implements "IApplicationService".

Something like :

public class TesttAppService : ApplicationService, ITestAppService
    {
// repositories ...

// Constructor ...

        #region Functions

        [AbpAuthorize]
        public List<string> GetValues(SearchDto Search)
        {
            ...
			
            return values;
        }

doc here <a class="postlink" href="http://www.aspnetboilerplate.com/Pages/Documents/Authorization">http://www.aspnetboilerplate.com/Pages/ ... horization</a>

What do you mean by "generate ASP.NET Boilerplate Framework offline" ?

ABP Framework sources are on gitHub and compiled version of Framework is available by nuget packages.

If you mean the default startup project, there is no (yet) generator in VisualStudio. Starting your new app could be easy made downloading an empty structure here of ABP from here <a class="postlink" href="http://www.aspnetboilerplate.com/Templates">http://www.aspnetboilerplate.com/Templates</a>

searching on gitHub <a class="postlink" href="https://github.com/aspnetboilerplate/aspnetboilerplate/search?utf8=%E2%9C%93&q=WhereIf">https://github.com/aspnetboilerplate/as ... &q=WhereIf</a>

the third example could maybe help you.

Showing 11 to 20 of 126 entries