Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# web api和Mvc Razor中的Dotnet核心错误处理_C#_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

C# web api和Mvc Razor中的Dotnet核心错误处理

C# web api和Mvc Razor中的Dotnet核心错误处理,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,在我的web应用程序中,我有web API和普通MVC 我已经为httpResponse创建了一个扩展 public static void ShowApplicationError(this HttpResponse response, string exceptionMessage,string innerException) { var result = JsonConvert.SerializeObject(new { error = exceptionMess

在我的web应用程序中,我有web API和普通MVC 我已经为httpResponse创建了一个扩展

 public static void ShowApplicationError(this HttpResponse response, string exceptionMessage,string innerException)
    {
        var result = JsonConvert.SerializeObject(new { error = exceptionMessage ,detail=innerException });
        response.HttpContext.Response.WriteAsync(result);
    }
并在startup.cs中用于异常处理

app.UseExceptionHandler(builder =>
            {
                builder.Run(async context =>
                {
                    context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                    var error = context.Features.Get<IExceptionHandlerFeature>();
                    if (error != null)
                    {
                        context.Response.ShowApplicationError(error.Error.Message, error.Error.InnerException.Message);
                    }
                });
            });
app.UseExceptionHandler(生成器=>
{
运行(异步上下文=>
{
context.Response.StatusCode=(int)HttpStatusCode.InternalServerError;
var error=context.Features.Get();
if(错误!=null)
{
context.Response.ShowApplicationError(error.error.Message,error.error.InnerException.Message);
}
});
});
像这样。 这两种方法都适用。
我想区分每个请求的错误。我不想显示mvc end的json错误,我该怎么做。

HttpRequest中的ContentType和Accept标头区分输出类型,这在您的情况下已经足够了

您可以使用Accept标头进行检查

if (context.Request.Headers["Accept"] == "application/json" || context.Request.Headers["Accept"] == "application/xml")
{
    //Api Request
}
else
{
    //other request.
}

这种情况的最佳解决方案是更好地分离您的关注点。将api与MVC应用程序分开。它还将为以后的部署提供灵活性。如果这是现有代码而不是新代码,我会游说将其重构为一个单独的api项目。

您无法直接将内部服务器错误与MVC或web api与
错误区分开来。对于
MVC
webapi
,它们都继承自
Controller
ControllerBase

通常,我们通过向web api的路由路径添加
api
来区分它们。我建议您使用mvc设计您的项目,而不使用api路由,使用带有api路由的web api。然后通过
ExceptionHandlerFeature.path
检查路径

app.UseExceptionHandler(builder =>
{
    builder.Run(async context =>
    {
        context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
        var error = context.Features.Get<IExceptionHandlerFeature>();
        var error1 = context.Features.Get<IExceptionHandlerFeature>() as ExceptionHandlerFeature;
        var error2 = context.Features.Get<IExceptionHandlerPathFeature>();
        var requestPath = error2.Path;
        if (error != null)
        {
            context.Response.ShowApplicationError(error.Error.Message, error.Error.InnerException.Message);
        }
    });
});
app.UseExceptionHandler(生成器=>
{
运行(异步上下文=>
{
context.Response.StatusCode=(int)HttpStatusCode.InternalServerError;
var error=context.Features.Get();
var error1=context.Features.Get()作为ExceptionHandlerFeature;
var error2=context.Features.Get();
var requestPath=error2.Path;
if(错误!=null)
{
context.Response.ShowApplicationError(error.error.Message,error.error.InnerException.Message);
}
});
});

这必须适用于以下两种情况:。。。有什么问题?请定义您的问题我想知道一个mvc请求,这样我可以以不同的方式发送错误。编辑postAFAIK没有内置的方法来实现这一点。无论是API请求还是MVC请求,内部都是一样的。尝试将API分离到特定区域,然后您可以使用
区域
令牌区分请求并返回相关类型的响应在调用app.UseExceptionHandler之前您是否尝试调用app.useMvc?因此我必须为each@Selik没有必要分成两个项目,您可以在同一个项目中定义mvc控制器和web api控制器,只需确保为每个web api控制器添加
[Route(“api/[controller]”)]
。哦,对不起,您指的是“ExceptionHandlerFeature.Path”是有效的。谢谢。