Attualmente sto valutando ABP 3.9 e la creazione del locatario non funziona.
Non riesce durante l'esecuzione di questo codice:
CheckErrors(await _roleManager.CreateStaticRoles(tenant.Id));
Questa è l'eccezione che sto ottenendo:
Mvc.ExceptionHandling.AbpExceptionFilter - Format of the initialization string does not conform to specification starting at index 0.
System.ArgumentException: Format of the initialization string does not conform to specification starting at index 0.
at System.Data.Common.DbConnectionOptions.GetKeyValuePair(String connectionString, Int32 currentPosition, StringBuilder buffer, Boolean useOdbcRules, String& keyname, String& keyvalue)
at System.Data.Common.DbConnectionOptions.ParseInternal(Dictionary`2 parsetable, String connectionString, Boolean buildChain, Dictionary`2 synonyms, Boolean firstKey)
at System.Data.Common.DbConnectionOptions..ctor(String connectionString, Dictionary`2 synonyms)
at System.Data.SqlClient.SqlConnectionString..ctor(String connectionString)
at System.Data.SqlClient.SqlConnectionFactory.CreateConnectionOptions(String connectionString, DbConnectionOptions previous)
at System.Data.ProviderBase.DbConnectionFactory.GetConnectionPoolGroup(DbConnectionPoolKey key, DbConnectionPoolGroupOptions poolOptions, DbConnectionOptions& userConnectionOptions)
at System.Data.SqlClient.SqlConnection.ConnectionString_Set(DbConnectionPoolKey key)
at System.Data.SqlClient.SqlConnection.set_ConnectionString(String value)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerConnection.CreateDbConnection()
La stessa connessione Entity Framework funziona con altre classi ApplicationService
che ho aggiunto. Non so perché solo per la creazione dell'inquilino questo fallisce. Sto estendendo il modello di esempio, che è disponibile gratuitamente sul sito ASP.NET Boilerplate.
Grazie mille per l'aiuto. Saluti, Zainu
Fino a quando il codice non era stato distribuito in Azure non mi ero reso conto che sarebbe finito con l'eccezione "System.ApplicationException: impossibile trovare la cartella principale del contenuto".
Fortunatamente per me che c'è stata una discussione sullo stesso qui https://github.com/aspnetboilerplate/aspnetboilerplate-templates/issues/43 e la correzione è stata la stessa
var startupPath = System.IO.Directory.GetCurrentDirectory (); var configuration = AppConfigurations.Get (startupPath); tenant.ConnectionString = SimpleStringCipher.Instance.Encrypt (configuration.GetConnectionString (OneCloudConsts.ConnectionStringName));
Nella classe TenantAppService in Metodo di creazione ha commentato il codice che ha creato la stringa di connessione crittografata dall'input DTO. È stato aggiunto un modo per leggere la stringa di connessione dalla configurazione e questo ha funzionato nel mio caso poiché ho un unico database per tutti gli inquilini. Questo database sarebbe molto piccolo e memorizzerebbe solo i metadati sugli inquilini mentre la maggior parte dei dati dell'applicazione si troverebbe nell'archiviazione di Azure.
public override async Task<TenantDto> Create(CreateTenantDto input)
{
CheckCreatePermission();
// Create tenant
var tenant = ObjectMapper.Map<Tenant>(input);
//this code is commented since we have single database for all tenants
//tenant.ConnectionString = input.ConnectionString.IsNullOrEmpty()
// ? null
// : SimpleStringCipher.Instance.Encrypt(input.ConnectionString);
//This would read connection string from configuration and pass it to
//connectionstring property of AbpTenant
var configuration =
AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder());
tenant.ConnectionString = SimpleStringCipher.Instance.Encrypt(configuration.GetConnectionString(OneCloudConsts.ConnectionStringName));