After Upgrade Azure Function .Net 8 not able to debug code
Please find below my Program.cs and Startup.cs.
I read doc and it say in dotnet-isolated model, starup.cs is not required. Not able to follow then how can i handle my Dependency Injection.
Here is my Program.cs
var host = new HostBuilder()
.ConfigureFunctionsWorkerDefaults()
.ConfigureServices(services =>
{
services.AddApplicationInsightsTelemetryWorkerService();
services.ConfigureFunctionsApplicationInsights();
})
.ConfigureFunctionsWebApplication()
.Build();
host.Run();
Here is my Startup.cs File
class Startup : FunctionsStartup
{
private IConfiguration _configuration;
public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
{
var cred = new ClientSecretCredential(Settings.TenantId, Settings.ClientId, Settings.ClientSecret);
if (!string.IsNullOrEmpty(Settings.SecondaryAppConfigConnection))
{
builder.ConfigurationBuilder.AddAzureAppConfiguration(options =>
{
options.Connect(Settings.SecondaryAppConfigConnection)
.ConfigureKeyVault(kv => kv.SetCredential(cred))
.Select(KeyFilter.Any, LabelFilter.Null)
.Select(KeyFilter.Any, Settings.Environment);
}, true).AddAzureAppConfiguration(options =>
{
options.Connect(Settings.AppConfigConnection)
.ConfigureKeyVault(kv => kv.SetCredential(cred))
.Select(KeyFilter.Any, LabelFilter.Null)
.Select(KeyFilter.Any, Settings.Environment);
}, true);
}
else
{
builder.ConfigurationBuilder.AddAzureAppConfiguration(options =>
{
options.Connect(Settings.AppConfigConnection)
.ConfigureKeyVault(kv => kv.SetCredential(cred))
.Select(KeyFilter.Any, LabelFilter.Null)
.Select(KeyFilter.Any, Settings.Environment);
});
}
_configuration = builder.ConfigurationBuilder.Build();
}
public override void Configure(IFunctionsHostBuilder builder)
{
var settings = new GatewayFunctionSettingProvider(_configuration);
var connectionString = settings.GetConnectionString();
Endpoint.Utilities.Logging.LoggerHelpers.ConfigureSerilogForAzureFunctions(settings);
builder.Services.AddAzureAppConfiguration();
builder.Services.AddScoped<ICacheDataAdapter>(s => new RedisCacheDataAdapter(_configuration["RedisHost"]));
builder.Services.AddSingleton<ICertificateManager>(s => new CertificateManager(settings, new RedisCacheDataAdapter(_configuration["RedisHost"])));
builder.Services.AddSingleton<IMassTransitRequest<MonitorUserIdPoolRequest>>(s => new MassTransitRequest<MonitorUserIdPoolRequest>());
builder.Services.AddSingleton(s => settings);
builder.Services.AddSingleton<CoreSettingsProvider>(s => settings);
builder.Services.AddSingleton<SettingsProvider>(s => settings);
builder.Services.AddSingleton<IConnectionMultiplexer>(s => ConnectionMultiplexer.Connect(settings.RedisHost));
builder.Services.AddScoped<IHiLoDataAdapter>(s => new HiLoDataAdapter(connectionString, settings.UserIdHiLoCapacity));
builder.Services.AddScoped<IUserIdGenerationService, UserIdGenerationService>();
builder.Services.AddMassTransitForAzureFunctions(cfg =>{}, "AzureWebJobsServiceBus");
builder.Services.AddSingleton(Bus.Factory.CreateUsingAzureServiceBus(x => x.Host(settings.AzureWebJobsServiceBus)));
builder.Services.AddLogging();
builder.Services.AddSingleton(x => new BlobServiceClient(connectionString));
builder.Services.AddFunctionsWorkerDefaults();
SettingsProvider.RegisterCurrentProvider(() => settings);
}
}
local-settings.json
{
"IsEncrypted": false,
"Values": {
"FUNCTIONS_EXTENSION_VERSION": "~4",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
}
}
host.json
{
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
}
}
},
"functionTimeout": "00:30:00"
}
Here Function Code which has HTTP and Timer function
public class EmailAlertOnPasswordExpiration
{
private readonly ISendEndpointProvider sendEndpointProvider;
private GatewayFunctionSettingProvider settings;
public EmailAlertOnPasswordExpiration(ISendEndpointProvider SendEndpointProvider,
GatewayFunctionSettingProvider settings)
{
this.sendEndpointProvider = SendEndpointProvider;
this.settings = settings;
}
[Function("EmailAlertOnPasswordExpiration")]
public async Task Run([TimerTrigger("%EmailAlertOnPasswordExpirationTrigger%")]
TimerInfo myTimer, ILogger log)
{
log.LogInformation($"EmailAlertOnPasswordExpire Timer trigger function executed
at: {DateTime.Now}");
await PasswordExpiryUserList(log);
}
[Function("EmailAlertOnPasswordExpirationGet")]
public async Task<IActionResult> EmailAlertOnPasswordExpirationGet(
[HttpTrigger(AuthorizationLevel.Function, "get", Route = "Email-Alert")] HttpRequest req,
ILogger log)
{
log.LogInformation($"EmailAlertOnPasswordExpire GET trigger function executed at: {DateTime.Now}");
await PasswordExpiryUserList(log);
return new OkObjectResult("OK");
}
public async Task PasswordExpiryUserList(ILogger log)
{
var nodeNameProvider = new NodeNameProvider(settings.GetConnectionString());
var nodes = nodeNameProvider.GetNodes();
string query = "select u.UserName,u.FirstName, u.LastName,u.Id from [dbo].[Credential] c inner join dbo.[User] u on c.UserId = u.Id WHERE CONVERT(date, c.ExpiresOn) = CONVERT(DATE, DATEADD(day, 7, getdate())) and u.Active = 1 ";
using (SqlConnection connection = new SqlConnection(settings.GetConnectionString()))
{
connection.Open();
DataTable table = new DataTable();
using (var da = new SqlDataAdapter(query, connection))
{
da.Fill(table);
if (table.Rows.Count > 0)
{
log.LogInformation($"After execute query table has " + table.Rows.Count + " rows");
List<Endpoint.Contracts.UserData> userList = new List<Endpoint.Contracts.UserData>();
userList = (from DataRow dr in table.Rows
select new Endpoint.Contracts.UserData()
{
UserName = dr["UserName"].ToString(),
FirstName = dr["FirstName"].ToString(),
LastName = dr["LastName"].ToString(),
UserId = dr["Id"].ToString()
}).ToList();
UserDataMessage userMessage = new UserDataMessage
{
UserInfoData = userList
};
if (userMessage != null | userMessage.UserInfoData.Count > 0)
{
log.LogInformation($"UserList count is" + userMessage.UserInfoData.Count);
foreach (var nodeName in nodes)
{
try
{
var uri = new Uri($"queue:NodeWorker-{nodeName}");
var endpoint = await sendEndpointProvider.GetSendEndpoint(uri);
await endpoint.Send(userMessage, ctx =>
{
ctx.TimeToLive = TimeSpan.FromMinutes(1);
});
}
catch (Exception ex)
{
log.LogInformation($"Error posting Password Expiry Email Alert info to {nodeName}", ex);
}
}
}
else
{
log.LogInformation($"UserList is null");
}
}
else
{
log.LogInformation($"DataTable is null");
}
}
}
}
}
Please guide me how can i debug code? Not Getting error. When I run HTTP function