@@ -17,6 +17,7 @@ public class HttpClientTypeHandler(HttpTypeDefinition definition, Dictionary<str
1717 /// HttpClient for self-referencing calls (relative paths). Uses SelfBaseUrl or a custom handler.
1818 /// </summary>
1919 private static HttpClient ? _selfClient ;
20+ private string ? _resolvedUrl ;
2021
2122 /// <summary>
2223 /// Base URL for resolving relative paths (e.g., "/api/test" → "http://localhost:5000/api/test").
@@ -47,14 +48,16 @@ public async Task InvokeAsync(CancellationToken cancellationToken = default)
4748 for ( int attempt = 0 ; attempt <= maxRetries ; attempt ++ )
4849 {
4950 var startTimestamp = Stopwatch . GetTimestamp ( ) ;
51+ _resolvedUrl = ResolveValue ( definition . Url ) ;
52+ var resolvedUrl = _resolvedUrl ;
5053 if ( attempt == 0 )
5154 {
52- Logger ? . LogDebug ( "HTTP client starting {Method} request to '{Url}'" , definition . Method , definition . Url ) ;
55+ Logger ? . LogDebug ( "HTTP client starting {Method} request to '{Url}'" , definition . Method , resolvedUrl ) ;
5356 }
5457 else
5558 {
5659 Logger ? . LogDebug ( "HTTP client retrying {Method} request to '{Url}' (attempt {Attempt}/{MaxRetries})" ,
57- definition . Method , definition . Url , attempt + 1 , maxRetries + 1 ) ;
60+ definition . Method , resolvedUrl , attempt + 1 , maxRetries + 1 ) ;
5861 }
5962
6063 try
@@ -87,12 +90,12 @@ public async Task InvokeAsync(CancellationToken cancellationToken = default)
8790
8891 var elapsed = Stopwatch . GetElapsedTime ( startTimestamp ) ;
8992 Logger ? . LogDebug ( "Internal request to '{Url}' completed with status {StatusCode} in {Elapsed}ms" ,
90- definition . Url , StatusCode , elapsed . TotalMilliseconds . ToString ( "F1" ) ) ;
93+ resolvedUrl , StatusCode , elapsed . TotalMilliseconds . ToString ( "F1" ) ) ;
9194
9295 if ( ! IsSuccess && attempt < maxRetries && ShouldRetry ( StatusCode ) )
9396 {
9497 Logger ? . LogWarning ( "Internal request to '{Url}' returned {StatusCode}, retrying after {Delay}ms" ,
95- definition . Url , StatusCode , definition . RetryDelays ! [ attempt ] . TotalMilliseconds ) ;
98+ resolvedUrl , StatusCode , definition . RetryDelays ! [ attempt ] . TotalMilliseconds ) ;
9699 await Task . Delay ( definition . RetryDelays ! [ attempt ] , cancellationToken ) ;
97100 continue ;
98101 }
@@ -110,7 +113,7 @@ public async Task InvokeAsync(CancellationToken cancellationToken = default)
110113 if ( ! IsSuccess && attempt < maxRetries && ShouldRetry ( StatusCode ) )
111114 {
112115 Logger ? . LogWarning ( "HTTP client request to '{Url}' returned {StatusCode}, retrying after {Delay}ms" ,
113- definition . Url , StatusCode , definition . RetryDelays ! [ attempt ] . TotalMilliseconds ) ;
116+ resolvedUrl , StatusCode , definition . RetryDelays ! [ attempt ] . TotalMilliseconds ) ;
114117 await Task . Delay ( definition . RetryDelays ! [ attempt ] , cancellationToken ) ;
115118 continue ;
116119 }
@@ -124,12 +127,12 @@ public async Task InvokeAsync(CancellationToken cancellationToken = default)
124127 if ( attempt < maxRetries )
125128 {
126129 Logger ? . LogWarning ( "HTTP client request to '{Url}' timed out, retrying after {Delay}ms" ,
127- definition . Url , definition . RetryDelays ! [ attempt ] . TotalMilliseconds ) ;
130+ resolvedUrl , definition . RetryDelays ! [ attempt ] . TotalMilliseconds ) ;
128131 await Task . Delay ( definition . RetryDelays ! [ attempt ] , cancellationToken ) ;
129132 continue ;
130133 }
131134 Logger ? . LogWarning ( "HTTP client request to '{Url}' timed out after {Timeout}s" ,
132- definition . Url , definition . Timeout ? . TotalSeconds ?? 30 ) ;
135+ resolvedUrl , definition . Timeout ? . TotalSeconds ?? 30 ) ;
133136 }
134137 catch ( HttpRequestException ex )
135138 {
@@ -139,19 +142,19 @@ public async Task InvokeAsync(CancellationToken cancellationToken = default)
139142 if ( attempt < maxRetries )
140143 {
141144 Logger ? . LogWarning ( "HTTP client request to '{Url}' failed ({Message}), retrying after {Delay}ms" ,
142- definition . Url , ex . Message , definition . RetryDelays ! [ attempt ] . TotalMilliseconds ) ;
145+ resolvedUrl , ex . Message , definition . RetryDelays ! [ attempt ] . TotalMilliseconds ) ;
143146 await Task . Delay ( definition . RetryDelays ! [ attempt ] , cancellationToken ) ;
144147 continue ;
145148 }
146149 Logger ? . LogError ( ex , "HTTP client request to '{Url}' failed with status {StatusCode}" ,
147- definition . Url , StatusCode ) ;
150+ resolvedUrl , StatusCode ) ;
148151 }
149152 catch ( Exception ex )
150153 {
151154 StatusCode = 0 ;
152155 IsSuccess = false ;
153156 ErrorMessage = ex . Message ;
154- Logger ? . LogError ( ex , "HTTP client request to '{Url}' failed with unexpected error" , definition . Url ) ;
157+ Logger ? . LogError ( ex , "HTTP client request to '{Url}' failed with unexpected error" , resolvedUrl ) ;
155158 return ; // Unexpected errors are not retryable
156159 }
157160 }
@@ -229,7 +232,7 @@ private async Task ProcessResponseAsync(HttpResponseMessage response, long start
229232
230233 var duration = Stopwatch . GetElapsedTime ( startTimestamp ) ;
231234 Logger ? . LogDebug ( "HTTP client request to '{Url}' completed with status {StatusCode}, content-type: {ContentType}, body length: {BodyLength}, duration: {Duration}ms" ,
232- definition . Url , StatusCode , ContentType , Body ? . Length ?? 0 , duration . TotalMilliseconds ) ;
235+ _resolvedUrl ?? definition . Url , StatusCode , ContentType , Body ? . Length ?? 0 , duration . TotalMilliseconds ) ;
233236 }
234237
235238 private static string BuildHeadersJson ( HttpResponseMessage response )
0 commit comments