@@ -597,8 +597,7 @@ private HttpClient CreateHttpClient()
597597 var httpClient = new HttpClient ( httpMessageHandler ) ;
598598 httpClient . Timeout = HttpClientTimeout ;
599599
600- // Start with the user agent header
601- httpClient . DefaultRequestHeaders . Add ( Constants . UserAgent , Constants . UserAgentHeader ) ;
600+ var userSetUserAgent = false ;
602601
603602 // Apply any headers configured on the HttpConnectionOptions
604603 if ( _httpConnectionOptions ? . Headers != null )
@@ -608,6 +607,7 @@ private HttpClient CreateHttpClient()
608607 // Check if the key is User-Agent and remove if empty string then replace if it exists.
609608 if ( string . Equals ( header . Key , Constants . UserAgent , StringComparison . OrdinalIgnoreCase ) )
610609 {
610+ userSetUserAgent = true ;
611611 if ( string . IsNullOrEmpty ( header . Value ) )
612612 {
613613 httpClient . DefaultRequestHeaders . Remove ( header . Key ) ;
@@ -629,6 +629,14 @@ private HttpClient CreateHttpClient()
629629 }
630630 }
631631
632+ // Apply default user agent only if user hasn't specified one (empty or not)
633+ // Don't pre-emptively set this, some frameworks (mono) have different user agent format rules,
634+ // so allowing a user to set an empty one avoids throwing on those frameworks.
635+ if ( ! userSetUserAgent )
636+ {
637+ httpClient . DefaultRequestHeaders . Add ( Constants . UserAgent , Constants . UserAgentHeader ) ;
638+ }
639+
632640 httpClient . DefaultRequestHeaders . Remove ( "X-Requested-With" ) ;
633641 // Tell auth middleware to 401 instead of redirecting
634642 httpClient . DefaultRequestHeaders . Add ( "X-Requested-With" , "XMLHttpRequest" ) ;
0 commit comments