问题 CustomExceptionFilter和GlobalExceptionHandler有什么区别?

Raysefo

知名会员
已加入
2019年2月22日
留言内容
194
编程经验
10+
你好,

在我的asp.net Web API中,我同时使用GlobalExceptionHandler和CustomExceptionFilter。我认为他们做了同样的工作,向客户端隐藏了实际的错误并发送给他们"HTTP 500-内部服务器错误。请与您的管理员联系。"回复。我想知道是否删除GlobalExcepitonHandler并将Nlog添加到CustomExceptionFilter中,仍然可以发送相同的响应并记录错误吗?您对此有何看法?

UnhandledExceptionLogger无法捕获所有错误,这就是为什么我想在其中之一中添加日志记录的原因。

CustomExceptionFilter:
C#:
public class CustomExceptionFilter : ExceptionFilterAttribute
    {

        public override void OnException(HttpActionExecutedContext actionExecutedContext)
        {
            base.OnException(actionExecutedContext);


            var response = new HttpResponseMessage(HttpStatusCode.InternalServerError)
            {
                //Content = new StringContent("An unhandled exception was thrown by service."),
                ReasonPhrase = "HTTP 500-内部服务器错误。请与您的管理员联系。"
            };

            actionExecutedContext.Response = response;
        }
    }

GlobalExceptionHandler:
C#:
public class GlobalExceptionHandler : ExceptionHandler
    {
        
        public override void Handle(ExceptionHandlerContext context)
        {
            var result = new HttpResponseMessage(HttpStatusCode.InternalServerError)
            {
                Content = new StringContent("HTTP 500-内部服务器错误。请与您的管理员联系。"),
                ReasonPhrase = "Exception"
            };

            
            context.Result = new ErrorMessageResult(context.Request, result);
        }

        public class ErrorMessageResult : IHttpActionResult
        {
            private HttpRequestMessage _request;
            private readonly HttpResponseMessage _httpResponseMessage;

            public ErrorMessageResult(HttpRequestMessage request, HttpResponseMessage httpResponseMessage)
            {
                _request = request;
                _httpResponseMessage = httpResponseMessage;
            }

            public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
            {
                return Task.FromResult(_httpResponseMessage);
            }
        }

      }
UnhandledExceptionFilter:
C#:
public class UnhandledExceptionLogger : ExceptionLogger
    {
        private static readonly Logger logger = LogManager.GetCurrentClassLogger();

        public override void Log(ExceptionLoggerContext context)
        {
            var timestamp = DateTime.UtcNow;

            //NLOG
            NLog(logger, context.Exception, timestamp);
        }

        private void NLog(Logger logger, Exception message, DateTime timestamp)
        {
            var sb = new StringBuilder();
            sb.AppendLine(message.ToString());
            sb.AppendLine(timestamp.ToLongDateString());
            logger.Error(sb.ToString());
        }
    }
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
现在让我们暂不谈您的代码兔子问题之一。如果您仍在使用相同的旧地址来查询其服务器,那么我现在将退出本主题。当您应该回答隐含的问题时,似乎总是向我抛出无关的代码来回答您对我问题的解决方案……
为什么将数据发送到重定向流量的服务器地址。
如果您仍在使用相同的旧地址,则此操作将无效。如果您的API提供者尚未设置其API以使其显示在其地址上的地址有效 一个记录 对于202.76.234.81,您将无法对此查询 API。在没有获得gameultan的答案之前,没有必要进一步测试代码。询问他们为什么现在创建的测试站点将流量重定向,并询问其API是否在重定向域的位置上正常工作-qa-api.mol.com。还要求提供更新的查询信息。
teststore.gamesultan.com213.74.118.227
host-213-74-118-227.superonline.net
AS34984 Tellcom Iletisim Hizmetleri A.s.
火鸡
C#:
PORT     STATE    SERVICE
21/tcp   filtered ftp
22/tcp   filtered ssh
23/tcp   filtered telnet
80/tcp   filtered http
110/tcp  filtered pop3
143/tcp  filtered imap
443/tcp  open     https
qa-api.mol.com202.76.234.81AS24218全球交通通信-马来西亚
马来西亚
C#:
PORT     STATE    SERVICE
21/tcp   filtered ftp
22/tcp   filtered ssh
23/tcp   filtered telnet
80/tcp   open     http
110/tcp  filtered pop3
143/tcp  filtered imap
443/tcp  open     https
查询旧服务器(213.74.118.227)是一个丢失的原因。您不必笨拙地陷入困境,而是需要查找有关您要查询的网络的更多信息,然后将在与其余API分开的应用程序中执行一些测试代码。然后,一旦我们知道gameultan在新地址有有效的设置,我们就可以担心将您的测试代码与其余API合并。上面的结果来自nmap,可准确反映当前服务器状态。乍一看,哪个人的响应速度更快?有了这个问题,为什么还要查询旧地址?
 
Last edited:

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
好吧,它实际上重定向到了这里 http://qa-api.mol.com/pinstore/ 因此最好在测试应用中进行查询。

我以为你说他们没有任何文件?我现在闻到了些异味...是吗?
 

Raysefo

知名会员
已加入
2019年2月22日
留言内容
194
编程经验
10+
我在测试服务器(不是在我的笔记本电脑上)上进行了负载测试,有1000个用户访问了新地址。只有3个错误。我在测试服务器上安装了试用appoptics APM工具。这是最耗时的线程。 IIS有问题吗?

appoptics.png
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,536
地点
弗吉尼亚州切萨皮克
编程经验
10+
考虑到IIS是承载您的Web API的主体,因此从Web API接受请求到返回对已接受请求的响应之时,IIS必须一直在运行。我不知道您为什么会认为IIS错误。您期望什么来运行Web API代码?在仓鼠轮子上奔跑的小仓鼠?
 

Raysefo

知名会员
已加入
2019年2月22日
留言内容
194
编程经验
10+
@跳伞,我期望仓鼠不会提供帮助,但是我想知道为什么处理请求的时间过多。在测试开始时,持续时间约为1毫秒。我只是想使这项工作正确进行并更好地工作,当然要在你们的帮助下 :)
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,536
地点
弗吉尼亚州切萨皮克
编程经验
10+
For the fast responses, look at the corresponding HttpWebRequest calls.
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
从Web API接受请求的时间到返回响应的时间,IIS必须一直在运行。
IIS应该无限期运行,而不仅仅是在查询过程中。但是对于每个请求,都会有一个新线程。假设您在负载测试时也执行并行查询,无论是否并行,是否异步,我都认为随着执行渐进式查询,这种情况会增加。几乎所有您需要了解的IIS都可以阅读 IIS Web服务器:(Internet信息服务)
IIS有问题吗?
我想不是。我的猜测是,如果您的服务器资源,CPU / Ram等资源不足,请考虑给仓鼠喂食,以使其足以保持轮子运转。 ;)
 
Last edited:

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
关于并发与并行性有以下答案: 话题|受欢迎的 您应该注意,当同时运行代码块时,这需要更多资源。并发和并行的区别在这里更好地解释了: 并发,并行,线程,进程,异步和同步-相关吗? 🤔 如果一个块需要一个线程,而另一个块需要自己的线程,则同时运行多个代码块将占用硬件资源。如果您的服务器在有限的资源预算上运行,这是值得深思的。
 
最佳 底部