Невозможно выполнить простой GET-запрос к Nancy самостоятельно: RuntimeBinderException и ViewNotFoundException

Мой код:

public class MyWebService : IDisposable
{
    private readonly NancyHost _host;

    public MyWebService(int port = 7017)
    {
        var uri = new Uri(string.Format("http://localhost:{0}", port));
        _host = new NancyHost(uri);
        _host.Start();
    }

    public void Dispose()
    {
        if (_host != null)
        {
            _host.Stop();
            _host.Dispose();
        }
    }
}

internal class MyWebModule : NancyModule
{
    public MyWebModule()
    {
        Get["/"] = _ => "Received GET request";
    }
}

При выполнении следующего HTTP-запроса: GET http://localhost:7017/ используя REST-клиент Insomnia, я получаю следующие загадочные исключения:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Cannot convert type 'Nancy.ErrorHandling.DefaultStatusCodeHandler.DefaultStatusCodeHandlerResult' to 'Nancy.Response''
 at CallSite.Target(Closure , CallSite , Object )

С источником: Anonymously Hosted DynamicMethods Assembly

сопровождается

Nancy.ViewEngines.ViewNotFoundException
     at Nancy.ViewEngines.DefaultViewFactory.GetRenderedView(String viewName, Object model, ViewLocationContext viewLocationContext)

без какой-либо дополнительной информации об исключении.

Затем клиент REST показывает ошибку 404,

Что я определил неправильно? Я следовал следующему примеру: построение простого http-сервера-с-нэнси

1 ответ

Решение

Если вы запускаете свой код в отладчике - убедитесь, что выброшенное исключение фактически не обработано. Код может выдавать исключения, и ваш отладчик (если он настроен на это) может их сломать, даже если эти исключения обрабатываются (некоторыми catch блок). Поскольку вы получаете 404 ответа в конце концов, а не сбой - я предполагаю, что эти исключения являются частью "нормального" потока Нэнси и поэтому обрабатываются.

Что касается 404 - ваш модуль является внутренним, и Нэнси не обнаружит его. Сделайте это общедоступным:

public class MyWebModule : NancyModule
{
    public MyWebModule()
    {
        Get["/"] = _ => "Received GET request";
    }
}
Другие вопросы по тегам