Base solution for your next web application

Activities of "byteplatz"

Hello there

Am I missing somthing or AspNetZero v2 (core) does not have angular, only jquery ?

Is that correct?

Is that because of migration for angular v2 in next release ?

Bruno

Hello there,

I am using Abp for our NServiceBus Endpoint (Windows Service) and I need to configure the message handlers to work with multitenancy.

As far as I know, Abp uses AbpSession to retrieve TenantId for EntityFramework Dynamicfilter.

Since this service does not have logins, what would be the best way to deal with this when aI receive the message ?

  1. Create my own implementation for IAbpSession and register it as transient (thus being created for every message received) ?
  • Using this approach I can set TenantId and UserId into the session because the received message contains TenantId and UserId (headers). This way, EntityFramework dynamic filter will work transparently ?
  1. Just set the PropertyFilter (EF DynamicFilter) values when the message arrives ? This way the DB-part of the multitenancy side is solved, but we may hit other issues with Session being null ?

Appreciate your suggestions

Bruno

Hello guys,

I am having issues frequently when trying to debug an AspNetZero project.

We are using VS2015 and latest version of AspNetZero.

First time we debug the solution using F5 everything works normal. Then we stop debugging and make some code changes in order to fix/add something. We hit F5 again and the debugger starts, browser opens and the output window is filled with information until we can see the messages generating DynamicProxyGenAssembly2 (Castle proxies) and it stays there forever. Browser keeps loading (spinning wheel) and debug output shows nothing. No exception at all (even marking all exceptions to be break into in ExceptionSettings).

I don't know what else to investigate.

Does anyone have the same issue ?

Does anyone uses VS2015 with Abp and debug / stop / change code / debug again and it works normal ?

I'm using IIS Express. The only thing left for tests is to use normal IIS instead of express...

Thanks a lot and hope someone can help me out with this.

Bruno

Hello there,

I was wondering why ILocalizationManager does not get injected in custom classes (not appservice and alike) when using the Test infrastructure (extending from AbpIntegratedTestBase).

Is this expected behavior ?

If so, how can I make the ILocalizationManager to be registered in Test infrastructure?

Bruno

Hello Halil,

First of all, sorry for the long post, but Im stuck with this.

Im trying to use Abp infrastructure inside a NServiceBus Endpoint and I am having problems with unitofwork.

NServiceBus handle its own transaction and unitofwork when consuming a message and invoking a given handler. (<a class="postlink" href="http://docs.particular.net/nservicebus/pipeline/unit-of-work">http://docs.particular.net/nservicebus/ ... it-of-work</a>)

Inside this handler I am injecting few repositories. Think the Handler as more like a appservice triggered by a message received.

The problem is I cant get control over Abp unitofwork to be able to complete the transaction only after nservicebus has finished working with the message.

The approaches suggested in documentation (<a class="postlink" href="http://aspnetboilerplate.com/Pages/Documents/Unit-Of-Work">http://aspnetboilerplate.com/Pages/Docu ... it-Of-Work</a>) did not work for this specific case.

I really need your help to move forward.

This is the handler code which is instantiated by NServiceBus when a new message is received:

public class CreditGenerationApprovalHandler : IHandleMessages<ApproveCreditGeneration>
    {
        public IBus Bus { get; set; }

        public IRepository<Credit, Guid> CreditRepository { get; set; }

        public void Handle(ApproveCreditGeneration message)
        {
            Credit credit = CreditRepository.Get(message.CreditId.Value);
            credit.Approve();

            Bus.Publish<CreditGenerationApproved>(evt =>
            {
                evt.CreditId = credit.Id;
                evt.CreditValue = credit.Value;
            });
        }
    }

I have integrated the IoC and bootstrapped Abp like this (this is called by NServiceBus upon initialization):

public class AbpBootstrap : INeedInitialization
    {
        public void Customize(BusConfiguration configuration)
        {
            // Initialize Abp infrastructure
            var bootstrapper = new AbpBootstrapper();
            bootstrapper.IocManager.IocContainer.AddFacility<LoggingFacility>(f => f.UseLog4Net().WithConfig(ITSConsts.Log4NetConfigFile));
            bootstrapper.Initialize();
        }
    }

NServiceBus IoC is using Abp Windsor:

// Retrieves current IocContainer from Abp
var container = IocManager.Instance.IocContainer;

// Configure Container into NServiceBus
configuration.UseContainer<WindsorBuilder>(c => c.ExistingContainer(container));

If I don't configure anything, the transaction is aborted at the following method (which is what the documentation states, the method is atomic, it completes the transaction right after its execution):

Credit credit = CreditRepository.Get(message.CreditId.Value);

I cannot work that way because I need to perform other tarnsactional operations like Bus.Publish (MSMQ transactional queue).

If I decorate the Handle method with [UnitOfWork] the handler is not able to call it (can't figure why).

Another approach I have tried is using the IManageUnitsOfWork control for NServiceBus (which I believe I should disable Unitofwork at the handle method) and let NSB control it like :

public class EfUnitOfWorkManager : IManageUnitsOfWork, INeedInitialization
    {
        public ILogger Logger { get; set; }

        public IUnitOfWorkManager UowManager { get; set; }

        private IUnitOfWorkCompleteHandle _unitOfWork;

        public void Customize(BusConfiguration configuration)
        {
            configuration.RegisterComponents(config =>
            {
                config.ConfigureComponent<EfUnitOfWorkManager>(DependencyLifecycle.InstancePerCall);
            });
        }

        public void Begin()
        {
            Logger.Debug("NsbUnitOfWorkManager started.");
            _unitOfWork = UowManager.Begin();
        }

        public void End(Exception ex = null)
        {
            if (ex == null)
            {
                Logger.Debug("NsbUnitOfWorkManager completed.");
                UowManager.Current.SaveChanges();
            }
            else
            {
                Logger.Error("NsbUnitOfWorkManager failed.", ex);
            }
        }
    }

Are there any possibilities to disable the commit trnsaction and let me do it manually like mentioned above at the End method called by NServiceBus ?

Many thanks in advance

Bruno

Hello Halil, how are you ?

I was wondering if is possible for you to share the MultiProjectTemplate used to create AspNetZero solutions. I ask because we need to develop several separated modules and this is a tedious task.

I think youre using SideWaffle (as I saw question from someone using this to help you to create the multiproject template).

My intention is to customize this template for new module: File\NewProject\MyServiceModule and this will create the infrastructure needed (core, app, etc)

Thanks in advance

Bruno

Hello Halil,

Im testing the migration path we will use for our application. For a while, we will need to have both (legacy MVC and new AspNetZero Mvc) workin in parallel.

I would like to setup Owin shared cookie between AspNetZero and legacy MVC but I need to understand few things from your side.

If you create a solution with 02 different web projects (called Web1 and Web2) and leave the defaults for OWIN, both apps share same cookie authentication: if you decorate with [Authorize] and create user in Web1 then access Web2, Web2 will allow the request even if the user does not exists there. Thats okay and expected behavior (the cookie name are the same and the machine are the same as well).

This scenario creates (by using google chrome) one cookie "LocalStorage" for each webapp:

http://localhost:58830 - Web1
http://localhost:58831 - Web2

So far so good. This behavior is what Im trying to setup between AspNetZero and my legacy MVC app.

Now, from AspNetZero: When I start google chrome and navigate to aspnetzero home page (no logged in user yet) it does not create the "localstorage" cookie (like Web1 and Web2). Instead it creates the ASP.Net_SessionId and VerificationToken...

Thats okay for me...

But Im trying to understant what should I need to do to "SHARE" AspNetZero Cookie with Web1 and Web2. I've tried to set the same cookie name for all 3 apps but that didn't work.

I believe is something related to session or something.

Do you have any customization on owin/katana/session (besides AbpSession) that manage to change cookies ?

Can you help me on this issue ?

Bruno

Hello Halil,

I managed to make google auth work for aspnetzero and I was wondering if you can help me to understand if its possible to use same google login for diferente tenants ...

After logging with the first tenant (default for example), every time I click on G+ login icon it automatticaly signin into default tenant.

Is this possible?

If so I guess it will only work with Tenant detection using URL ?

Bruno

Hello Halil,

Im trying to understand the eventbus architecture and I have couple questions:

  1. What is the difference between EntityUpdatedEventData/EntityChangedEventData events ?

  2. Does the *ed events (Created, Updated, Changed, Deleted) are triggered after UoW has been commited ? If so, Are there any hooks I can get to do some work (transactionally) before this happen ? My scenario is :

Im using NServiceBus as a BackEnd Message System. I would like the existing EventBus (from Abp) infrastructure from the WebSide to minimize the code I need to write. The problem Is, when an Entity is created for example, I need to run a Bus.Send(onesimplecommand) -- from NServiceBus. This code must be present in the same transaction used to SAVE the entity into the database, since Im using transactional MSMQ queues. This helps me in terms of if I cant write to database, Bus.Send does not happen and if Bus.Send throws an exception, the data is not written to database. (they must be in the same transaction).

Cany ou shed some light on how I can solve this ?

Bruno

Hello,

After moving to the next step of my separated solution with custom module, I have created the unitofwork/crud operation of a very basic entity. New DataModule created tests running ok.

I have updated the nuget package from main app, and when I log in I get this exception

System.NotSupportedException: The specified LINQ expression contains references to queries that are associated with different contexts.

The exception is being raised at :

var loginResult = await _userManager.LoginAsync(usernameOrEmailAddress, password, tenancyName);

from AccountController:

private async Task<AbpUserManager<Tenant, Role, User>.AbpLoginResult> GetLoginResultAsync(string usernameOrEmailAddress, string password, string tenancyName)
        {
            var loginResult = await _userManager.LoginAsync(usernameOrEmailAddress, password, tenancyName);

            switch (loginResult.Result)
            {
                case AbpLoginResultType.Success:
                    return loginResult;
                default:
                    throw CreateExceptionForFailedLoginAttempt(loginResult.Result, usernameOrEmailAddress, tenancyName);
            }
        }

I have folowed Sample.Blog and changed to v1.6 accordingly

Any ideas ?

It looks like the DI is injecting the Custom Module DbContext into AccountController (UserManager) and trying to mix them up...

Bruno

Showing 1 to 10 of 17 entries