.NET Core ArugmentNullException, вызывающий серьезный сбой в приложении WebAPI? Зачем? - PullRequest
0 голосов
/ 14 мая 2018

Так что я столкнулся с очень странной проблемой создания простого шаблона WebAPI с использованием .NET Core (2.1.200 cli) и VSCode (1.23.1).Большинство исключений, в случае их появления, помещают меня в отладчик VSCode и после продолжения возвращают страницу исключений разработчика, отправленную в браузер.Однако при возникновении ArugmentNullException ... происходит сбой приложения без взаимодействия с отладчиком VSCode.

Program.cs (код шаблона веб-интерфейса по умолчанию)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

namespace ExceptionIssue {
  public class Program {
    public static void Main(string[] args) {
      BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
      WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .Build();
  }
}

Startup.cs (код шаблона веб-интерфейса по умолчанию)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;

namespace ExceptionIssue {
  public class Startup {
    public Startup(IConfiguration configuration) {
      Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services) {
      services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
      if (env.IsDevelopment()) {
        app.UseDeveloperExceptionPage();
      }

      app.UseMvc();
    }
  }
}

. \ Controllers \ ValuesController.cs (измененное получение)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace ExceptionIssue.Controllers {
  [Route("api/[controller]")]
  public class ValuesController : Controller {
    // GET api/values
    [HttpGet]
    public IEnumerable<string> Get() {
      return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    [HttpGet("{id}")]
    public string Get(int id) {
      String result = null;
      switch (id) {
        case 1:
          throw new Exception("One");
        break;
        case 2:
          throw new ArgumentNullException("Two");
        break;
        case 3:
          result = String.Format(null, "UH OH");
        break;        
        case 4:
          String template = null;
          result = String.Format(template, "UH OH");
        break;
      }
      return result;
    }

    // POST api/values
    [HttpPost]
    public void Post([FromBody]string value) {
    }

    // PUT api/values/5
    [HttpPut("{id}")]
    public void Put(int id, [FromBody]string value) {
    }

    // DELETE api/values/5
    [HttpDelete("{id}")]
    public void Delete(int id) {
    }
  }
}
  • Также обратите внимание, что String.Format (null, "UH OH"); возвращает "UH OH", тогда как String.Format (template, "UH OH); создает исключение ArgumentNullException (не уверен, почему есть разница, если они оба не делают одно и то же).

Не уверен, что это проблема .NET Core, Kestrel или VSCode, но она воспроизводится на 100% примоя часть.

1 Ответ

0 голосов
/ 14 мая 2018

У меня была пара со-разработчиков, которые помогли мне углубиться в это, и похоже, что это на самом деле проблема с самим отладчиком ms-vscode.chsarp (1.15.1).

Запуск моего кода без отладки (CTRL-F5) работает как положено. Аналогично, выполнение моего кода с отладкой на более старой версии отладчика также работает как ожидалось. Так что это, похоже, ошибка в последней версии отладчика, что имеет смысл, так как приложение просто аварийно завершает работу, даже не прерывая строку, вызвавшую исключение.

Думаю, я передам это ребятам из Омнишарпа.

...