Произошло необработанное исключение: неправильно сформированный URL в режиме выпуска в приложении.net core 2.0
У меня есть .net core 2.0
приложение, которое использует IdentityServer 4. он отлично работает в режиме разработки. Затем я опубликовал его для производственного режима и протестировал. когда я щелкаю (у этого действия есть метод для сгенерированного маркера доступа), я получаю сообщение об ошибке, как показано ниже,
Произошло необработанное исключение: неправильно сформированный URL
тогда ошибка возникает здесь в режиме производства (выпуска):
var disco = await IdentityModel.Client.DiscoveryClient.GetAsync(_configuration.GetSection("Settings").GetSection("DiscoveryClient").Value);
выше DiscoveryClient
является http
не https
вот полное описание ошибки..
Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[0]
An unhandled exception has occurred: Malformed URL
System.InvalidOperationException: Malformed URL
at IdentityModel.Client.DiscoveryClient.ParseUrl(String input)
at IdentityModel.Client.DiscoveryClient..ctor(String authority, HttpMessageHandler innerHandler)
at IdentityModel.Client.DiscoveryClient.<GetAsync>d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
это потому что "https". Я понятия не имею, что происходит. Надеюсь, ваша помощь с этим.
2 ответа
Это довольно старый пост, но он все еще может кому-то помочь. У меня была точно такая же проблема, только URL-адрес, который я передал, был в порядке. Проблема с моей стороны заключалась в том, что URL-адрес центра IdentityServer был неправильно настроен, что привело к тому же исключению.
Вот фрагмент кода от DiscoveryClient's ParseUrl
показывая, когда он выдает это исключение:
public static DiscoveryEndpoint ParseUrl(string input)
{
var success = Uri.TryCreate(input, UriKind.Absolute, out var uri);
if (success == false)
{
throw new InvalidOperationException("Malformed URL");
}
if (!DiscoveryEndpoint.IsValidScheme(uri))
{
throw new InvalidOperationException("Malformed URL");
}
Вот код для DiscoveryEndpointIsValidScheme
метод:
public static bool IsValidScheme(Uri url)
{
if (string.Equals(url.Scheme, "http", StringComparison.OrdinalIgnoreCase) ||
string.Equals(url.Scheme, "https", StringComparison.OrdinalIgnoreCase))
{
return true;
}
return false;
}
Исходя из этого, исключение не выдается, потому что URL использует http
,
Попробуйте позвонить
new Uri(_configuration.GetSection("Settings").GetSection("DiscoveryClient").Value, UriKind.Absolute)
перед вызовом IdentityModel.Client.DiscoveryClient.GetAsync, чтобы вы могли видеть, какое исключение выдается конструктором Uri.