Произошло необработанное исключение: неправильно сформированный 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.

Другие вопросы по тегам