diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java
index 0e52caf072d..d52b817990f 100644
--- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java
+++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java
@@ -1025,7 +1025,7 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
supportingFiles.add(new SupportingFile("ApiFactory.mustache", clientPackageDir, "ApiFactory.cs"));
supportingFiles.add(new SupportingFile("DateTimeJsonConverter.mustache", clientPackageDir, "DateTimeJsonConverter.cs"));
supportingFiles.add(new SupportingFile("DateTimeNullableJsonConverter.mustache", clientPackageDir, "DateTimeNullableJsonConverter.cs"));
- supportingFiles.add(new SupportingFile("ApiResponseEventArgs.mustache", clientPackageDir, "ApiResponseEventArgs.cs"));
+ supportingFiles.add(new SupportingFile("ApiResponseEventArgs`1.mustache", clientPackageDir, "ApiResponseEventArgs.cs"));
supportingFiles.add(new SupportingFile("JsonSerializerOptionsProvider.mustache", clientPackageDir, "JsonSerializerOptionsProvider.cs"));
supportingFiles.add(new SupportingFile("CookieContainer.mustache", clientPackageDir, "CookieContainer.cs"));
supportingFiles.add(new SupportingFile("Option.mustache", clientPackageDir, "Option.cs"));
diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/ApiResponseEventArgs.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/ApiResponseEventArgs.mustache
deleted file mode 100644
index a79086e63ad..00000000000
--- a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/ApiResponseEventArgs.mustache
+++ /dev/null
@@ -1,58 +0,0 @@
-using System;
-using System.Net;
-
-namespace {{packageName}}.{{clientPackage}}
-{
- ///
- /// Useful for tracking server health.
- ///
- {{>visibility}} class ApiResponseEventArgs : EventArgs
- {
- ///
- /// The time the request was sent.
- ///
- public DateTime RequestedAt { get; }
-
- ///
- /// The time the response was received.
- ///
- public DateTime ReceivedAt { get; }
-
- ///
- /// The HttpStatusCode received.
- ///
- public HttpStatusCode HttpStatus { get; }
-
- ///
- /// The path requested.
- ///
- public string PathFormat { get; }
-
- ///
- /// The elapsed time from request to response.
- ///
- public TimeSpan ToTimeSpan => this.ReceivedAt - this.RequestedAt;
-
- ///
- /// The path
- ///
- public string Path { get; }
-
- ///
- /// The event args used to track server health.
- ///
- ///
- ///
- ///
- ///
- ///
- public ApiResponseEventArgs(DateTime requestedAt, DateTime receivedAt, HttpStatusCode httpStatus, string pathFormat, string path)
- {
- RequestedAt = requestedAt;
- ReceivedAt = receivedAt;
- HttpStatus = httpStatus;
- PathFormat = pathFormat;
- Path = path;
- }
- }
-}
diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/ApiResponseEventArgs`1.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/ApiResponseEventArgs`1.mustache
new file mode 100644
index 00000000000..6e8d3c4780e
--- /dev/null
+++ b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/ApiResponseEventArgs`1.mustache
@@ -0,0 +1,24 @@
+using System;
+
+namespace {{packageName}}.{{clientPackage}}
+{
+ ///
+ /// Useful for tracking server health
+ ///
+ {{>visibility}} class ApiResponseEventArgs : EventArgs
+ {
+ ///
+ /// The ApiResponse
+ ///
+ public ApiResponse ApiResponse { get; }
+
+ ///
+ /// The ApiResponseEventArgs
+ ///
+ ///
+ public ApiResponseEventArgs(ApiResponse apiResponse)
+ {
+ ApiResponse = apiResponse;
+ }
+ }
+}
diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/HostConfiguration.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/HostConfiguration.mustache
index 921149b17e6..ec0a819fb75 100644
--- a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/HostConfiguration.mustache
+++ b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/HostConfiguration.mustache
@@ -49,6 +49,7 @@ namespace {{packageName}}.{{clientPackage}}
{{/models}}
_services.AddSingleton(new JsonSerializerOptionsProvider(_jsonOptions));
_services.AddSingleton();{{#apiInfo}}{{#apis}}
+ _services.AddSingleton<{{classname}}Events>();
_services.AddTransient<{{interfacePrefix}}{{classname}}, {{classname}}>();{{/apis}}{{/apiInfo}}
}
diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/api.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/api.mustache
index 0c1856bfbf6..75676b14a38 100644
--- a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/api.mustache
+++ b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/api.mustache
@@ -13,6 +13,7 @@ using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using {{packageName}}.{{clientPackage}};
+using {{packageName}}.{{apiPackage}};
{{#hasImport}}
using {{packageName}}.{{modelPackage}};
{{/hasImport}}
@@ -26,6 +27,11 @@ namespace {{packageName}}.{{interfacePrefix}}{{apiPackage}}
///
{{>visibility}} interface {{interfacePrefix}}{{classname}} : IApi
{
+ ///
+ /// The class containing the events
+ ///
+ {{classname}}Events Events { get; }
+
{{#operation}}
///
/// {{summary}}
@@ -62,6 +68,28 @@ namespace {{packageName}}.{{interfacePrefix}}{{apiPackage}}
namespace {{packageName}}.{{apiPackage}}
{
+ ///
+ /// Represents a collection of functions to interact with the API endpoints
+ /// This class is registered as transient.
+ ///
+ {{>visibility}} class {{classname}}Events
+ {
+ {{#lambda.trimTrailingWhiteSpace}}
+ {{#operation}}
+ ///
+ /// The event raised after the server response
+ ///
+ public event EventHandler>{{nrt?}} On{{operationId}};
+
+ internal void ExecuteOn{{operationId}}(ApiResponse<{{{returnType}}}{{^returnType}}object{{/returnType}}> apiResponse)
+ {
+ On{{operationId}}?.Invoke(this, new ApiResponseEventArgs<{{{returnType}}}{{^returnType}}object{{/returnType}}>(apiResponse));
+ }
+
+ {{/operation}}
+ {{/lambda.trimTrailingWhiteSpace}}
+ }
+
///
/// Represents a collection of functions to interact with the API endpoints
///
@@ -77,7 +105,12 @@ namespace {{packageName}}.{{apiPackage}}
///
/// The HttpClient
///
- public HttpClient HttpClient { get; }{{#hasApiKeyMethods}}
+ public HttpClient HttpClient { get; }
+
+ ///
+ /// The class containing the events
+ ///
+ public {{classname}}Events Events { get; }{{#hasApiKeyMethods}}
///
/// A token provider of type
@@ -108,7 +141,7 @@ namespace {{packageName}}.{{apiPackage}}
/// Initializes a new instance of the class.
///
///
- public {{classname}}(ILogger<{{classname}}> logger, HttpClient httpClient, JsonSerializerOptionsProvider jsonSerializerOptionsProvider{{#hasApiKeyMethods}},
+ public {{classname}}(ILogger<{{classname}}> logger, HttpClient httpClient, JsonSerializerOptionsProvider jsonSerializerOptionsProvider, {{classname}}Events {{#lambda.camelcase_param}}{{classname}}Events{{/lambda.camelcase_param}}{{#hasApiKeyMethods}},
TokenProvider apiKeyProvider{{/hasApiKeyMethods}}{{#hasHttpBearerMethods}},
TokenProvider bearerTokenProvider{{/hasHttpBearerMethods}}{{#hasHttpBasicMethods}},
TokenProvider basicTokenProvider{{/hasHttpBasicMethods}}{{#hasHttpSignatureMethods}},
@@ -117,7 +150,8 @@ namespace {{packageName}}.{{apiPackage}}
{
_jsonSerializerOptions = jsonSerializerOptionsProvider.Options;
Logger = logger;
- HttpClient = httpClient;{{#hasApiKeyMethods}}
+ HttpClient = httpClient;
+ Events = {{#lambda.camelcase_param}}{{classname}}Events{{/lambda.camelcase_param}};{{#hasApiKeyMethods}}
ApiKeyProvider = apiKeyProvider;{{/hasApiKeyMethods}}{{#hasHttpBearerMethods}}
BearerTokenProvider = bearerTokenProvider;{{/hasHttpBearerMethods}}{{#hasHttpBasicMethods}}
BasicTokenProvider = basicTokenProvider;{{/hasHttpBasicMethods}}{{#hasHttpSignatureMethods}}
@@ -496,10 +530,12 @@ namespace {{packageName}}.{{apiPackage}}
{
string responseContentLocalVar = await httpResponseMessageLocalVar.Content.ReadAsStringAsync({{#net60OrLater}}cancellationToken{{/net60OrLater}}).ConfigureAwait(false);
- ApiResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}object{{/returnType}}> apiResponseLocalVar = new ApiResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}object{{/returnType}}>(httpRequestMessageLocalVar, httpResponseMessageLocalVar, responseContentLocalVar, "{{path}}", requestedAtLocalVar, _jsonSerializerOptions);
+ ApiResponse<{{{returnType}}}{{^returnType}}object{{/returnType}}> apiResponseLocalVar = new ApiResponse<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}object{{/returnType}}>(httpRequestMessageLocalVar, httpResponseMessageLocalVar, responseContentLocalVar, "{{path}}", requestedAtLocalVar, _jsonSerializerOptions);
After{{operationId}}DefaultImplementation({{#lambda.joinWithComma}}apiResponseLocalVar {{#allParams}}{{paramName}} {{/allParams}}{{/lambda.joinWithComma}});
+ Events.ExecuteOn{{operationId}}(apiResponseLocalVar);
+
{{#authMethods}}
if (apiResponseLocalVar.StatusCode == (HttpStatusCode) 429)
foreach(TokenBase tokenBaseLocalVar in tokenBaseLocalVars)
diff --git a/samples/client/petstore/csharp/OpenAPIClient-generichost-net6.0-nrt/src/Org.OpenAPITools/Api/AnotherFakeApi.cs b/samples/client/petstore/csharp/OpenAPIClient-generichost-net6.0-nrt/src/Org.OpenAPITools/Api/AnotherFakeApi.cs
index a0bfbba9827..81e2eb36092 100644
--- a/samples/client/petstore/csharp/OpenAPIClient-generichost-net6.0-nrt/src/Org.OpenAPITools/Api/AnotherFakeApi.cs
+++ b/samples/client/petstore/csharp/OpenAPIClient-generichost-net6.0-nrt/src/Org.OpenAPITools/Api/AnotherFakeApi.cs
@@ -19,6 +19,7 @@ using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using Org.OpenAPITools.Client;
+using Org.OpenAPITools.Api;
using Org.OpenAPITools.Model;
namespace Org.OpenAPITools.IApi
@@ -29,6 +30,11 @@ namespace Org.OpenAPITools.IApi
///
public interface IAnotherFakeApi : IApi
{
+ ///
+ /// The class containing the events
+ ///
+ AnotherFakeApiEvents Events { get; }
+
///
/// To test special tags
///
@@ -56,6 +62,23 @@ namespace Org.OpenAPITools.IApi
namespace Org.OpenAPITools.Api
{
+ ///
+ /// Represents a collection of functions to interact with the API endpoints
+ /// This class is registered as transient.
+ ///
+ public class AnotherFakeApiEvents
+ {
+ ///
+ /// The event raised after the server response
+ ///
+ public event EventHandler>? OnCall123TestSpecialTags;
+
+ internal void ExecuteOnCall123TestSpecialTags(ApiResponse apiResponse)
+ {
+ OnCall123TestSpecialTags?.Invoke(this, new ApiResponseEventArgs(apiResponse));
+ }
+ }
+
///
/// Represents a collection of functions to interact with the API endpoints
///
@@ -73,6 +96,11 @@ namespace Org.OpenAPITools.Api
///
public HttpClient HttpClient { get; }
+ ///
+ /// The class containing the events
+ ///
+ public AnotherFakeApiEvents Events { get; }
+
///
/// A token provider of type
///
@@ -102,7 +130,7 @@ namespace Org.OpenAPITools.Api
/// Initializes a new instance of the class.
///
///
- public AnotherFakeApi(ILogger logger, HttpClient httpClient, JsonSerializerOptionsProvider jsonSerializerOptionsProvider,
+ public AnotherFakeApi(ILogger logger, HttpClient httpClient, JsonSerializerOptionsProvider jsonSerializerOptionsProvider, AnotherFakeApiEvents anotherFakeApiEvents,
TokenProvider apiKeyProvider,
TokenProvider bearerTokenProvider,
TokenProvider basicTokenProvider,
@@ -112,6 +140,7 @@ namespace Org.OpenAPITools.Api
_jsonSerializerOptions = jsonSerializerOptionsProvider.Options;
Logger = logger;
HttpClient = httpClient;
+ Events = anotherFakeApiEvents;
ApiKeyProvider = apiKeyProvider;
BearerTokenProvider = bearerTokenProvider;
BasicTokenProvider = basicTokenProvider;
@@ -253,6 +282,8 @@ namespace Org.OpenAPITools.Api
AfterCall123TestSpecialTagsDefaultImplementation(apiResponseLocalVar, modelClient);
+ Events.ExecuteOnCall123TestSpecialTags(apiResponseLocalVar);
+
return apiResponseLocalVar;
}
}
diff --git a/samples/client/petstore/csharp/OpenAPIClient-generichost-net6.0-nrt/src/Org.OpenAPITools/Api/DefaultApi.cs b/samples/client/petstore/csharp/OpenAPIClient-generichost-net6.0-nrt/src/Org.OpenAPITools/Api/DefaultApi.cs
index 1324a529bd5..14e463f368d 100644
--- a/samples/client/petstore/csharp/OpenAPIClient-generichost-net6.0-nrt/src/Org.OpenAPITools/Api/DefaultApi.cs
+++ b/samples/client/petstore/csharp/OpenAPIClient-generichost-net6.0-nrt/src/Org.OpenAPITools/Api/DefaultApi.cs
@@ -19,6 +19,7 @@ using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using Org.OpenAPITools.Client;
+using Org.OpenAPITools.Api;
using Org.OpenAPITools.Model;
namespace Org.OpenAPITools.IApi
@@ -29,6 +30,11 @@ namespace Org.OpenAPITools.IApi
///
public interface IDefaultApi : IApi
{
+ ///
+ /// The class containing the events
+ ///
+ DefaultApiEvents Events { get; }
+
///
///
///
@@ -98,6 +104,43 @@ namespace Org.OpenAPITools.IApi
namespace Org.OpenAPITools.Api
{
+ ///
+ /// Represents a collection of functions to interact with the API endpoints
+ /// This class is registered as transient.
+ ///
+ public class DefaultApiEvents
+ {
+ ///
+ /// The event raised after the server response
+ ///
+ public event EventHandler>? OnFooGet;
+
+ internal void ExecuteOnFooGet(ApiResponse apiResponse)
+ {
+ OnFooGet?.Invoke(this, new ApiResponseEventArgs(apiResponse));
+ }
+
+ ///
+ /// The event raised after the server response
+ ///
+ public event EventHandler>? OnGetCountry;
+
+ internal void ExecuteOnGetCountry(ApiResponse