Вероятно, вы получили свое промежуточное программное обеспечение, зарегистрированное в неправильном месте в конвейере. Порядок, в котором вы размещаете свое промежуточное ПО в startup.cs
, имеет значение. Например:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Use(async (context, next) =>
{
try
{
await next();
}
catch (Exception ex)
{
context.Response.StatusCode = StatusCodes.Status403Forbidden;
await context.Response.WriteAsync(ex.Message);
}
});
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc();
}
В приведенном выше коде я зарегистрировал промежуточное программное обеспечение, подобное вашему в начале конвейера. ASP.NET Core обрабатывает любые запросы в том порядке, в котором вы их размещаете, поэтому мое собственное промежуточное программное обеспечение будет запускаться сначала для запроса. Однако ответы обрабатываются снизу вверх. Итак, в примере, когда исключение выбрасывается в контроллер (или где угодно), UseDeveloperExceptionPage
или UseExceptionHandler
сначала получат какое-либо исключение, обработайте его и измените код состояния на 500.
Если мы изменим порядок на это:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.Use(async (context, next) =>
{
try
{
await next();
}
catch (Exception ex)
{
context.Response.StatusCode = StatusCodes.Status403Forbidden;
await context.Response.WriteAsync(ex.Message);
}
});
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc();
}
Теперь мы зарегистрировали наш обработчик после встроенного обработчика исключений для запроса, но, что более важно, перед ним для ответа. Таким образом, в этом случае, когда контроллер выдает исключение, наш обработчик поймает его, обработает и изменит код состояния на то, что мы хотим. Другие обработчики исключений не будут видеть исключение (если другой обработчик промежуточного кода не выдает исключение после нас).
Вы можете уменьшить свой код до чего-то вроде:
let number = Int.random(in: 0 ... 36)
let color = Int.random(in: 1 ... 2)
switch (number, color) {
case (0, _):
print("The number is 0 and the color is Green!")
case (_, 1):
print("The number is \(number) and is Red")
case (_, 2):
print("The number is \(number) and is Black")
default:
break
}
Теперь, очевидно, на реальном колесе рулетки, цвета и числа не являются независимыми, как предполагает этот код, но это один из способов упростите ваш код, оставив при этом ясное намерение.
Весь ваш код может быть таким простым:
let number = Int.random(in: 0 ..< 37)
let color = Int.random(in: 1 ..< 3)
print("The Number is \(number) and the color is \(color == 1 ? "Red" : "Black")")
Вот и все. Нет необходимости в кортеже или в switch
.