Hi,
When using the TenantSettingValueProvider to retrieve the setting, is it possible to get a value for the host as well? for example, if the value is null for the tenant i want to fallback to the value from the host level
How can we have these settings configurable form the UI (Angular)?
I would like to be able to log in as a tenant admin and configure the URL and API key for the 3rd party service in the UI
I know ABP has a settings page but was not able to find the documentation for updating the UI page for new properties

Business requirement: We need to connect to 3rd party services (OpenAI) via connection sting and API key. Each tenant would have their own connection sting and API key. However if not defined on the tenant level, we need to fallback to a host-defined connection string and API key.
Question: Would settings module be suitable for handling this use case or would it be better add new columns to the SaasTenant table to track the connection string and API keys? We need the API keys to be encrypted if it is being stored in the Database. Would need your support on the optimal solution for this requirement
Thank you
Thank you, I think we can close off this ticket then.
FYI I found this: https://github.com/abpframework/abp/issues/18793
That's strange, because currently any of my DB operations will not update the DB until the application is shut down. I've tried using the [UnitOfWork] attribute, and also the autoSave = true in the .InsertAsync method
Any suggestions besides using the UnitOfWorkManager?
Or
Move
MessagingHubtoApplicationproject.public class MessageHandlingService : AbpSolution7AppService, IMessageHandlingService { private readonly IHubContext<MessagingHub> _messagingHub; public MessageHandlingService(IHubContext<MessagingHub> messagingHub) { _messagingHub = messagingHub; } public virtual async Task HandleMessage(string connectionId, string message) { Console.WriteLine(connectionId); Console.WriteLine(message); await _messagingHub.Clients.Client(connectionId).SendAsync("ReceiveMessage", message); } }
Thank you Shi Wei,
In that case I will attempt this method, so as to maintain any auditing / uow capabilities.
Just to clarify the application structure is like this MessageHub --has-a--> Service1 (does not inherit xxxAppService) --has-a--> Service2 (inherits xxxAppService)
would the method calls in Service 2 have an interceptor (uow, auditing) capabiilities? Thank you
Thank you Shi Wei,
When i don't inherit the MyApplicationAppService in my application service, it just means that:
ITransientDependency/ IScopedDependency / ISingletonDependencyCurrentUser / CurrentTenantIs there any impact on the UOW scope? All along I've not inherited MyApplicationAppService and I realized that for my DB transactions to complete, I keep needing to add
using(var uow = _unitOfWorkManager.Begin(requiresNew: true)){
...
Does that relate to inheriting MyApplicationAppService? Or is that because everything is happening in a single UOW for the websocket connection?
Thank you ShiWei,
I've sent the file.
Once application launched, go to https://localhost:44349/htmlpage.html then send a message. You will see this in your dev tools
Then, you will see the BE error console as raised above (snippet):
Method may only be called on a Type for which Type.IsGenericParameter is true. etc...
To resolve the error, check out my commented code in MessagingHub.cs. Swap out the method overload. However this would not allow us to pass a callback function.
Hi ShiWei,
I've noticed a similar error message pop up whenever I try to call this method in ICommunicationService
Task HandleMessage(string connectionId, string message, System.Func<string, string, Task> signalCallback)
I've made CommunicationService inherit MyApplicationAppService and the moment this method is called, it throws an error with the same message as shown above
In MessagingHub the error is thrown when the code at line 50 is called

the signalCallback passed into HandleMessage is being defined in MessagingHub:
public async Task SendMessage(string connectionId, string message)
{
_logger.LogInformation(">>> Sending WebRTC message to {connectionId}: {message}", connectionId, message);
await Clients.Client(connectionId).SendAsync("ReceiveWebRtcMessage", message);
}
Do you have any insights to the error message and possible resolution for it? I have some suspicion that it is something to do with Func<string, string, Task> callback function passed as a parameter