HttpClient异常捕获

当遇到某一类异常不进行重试

Code

var polly = Policy.Handle(ex => NeedHandlerRetryException(ex)).WaitAndRetryAsync(2,
                    retryAttempt => TimeSpan.FromSeconds(2)
                 );

private bool NeedHandlerRetryException(Exception ex)
{
    if(ex.StatusCode == 0)
    {
        var actualException = ex.InnerException;
        if(actualException  != null)
        {                
            if(actualException is TimeoutException ||(actualException is WebException webEx && webEx.Statu== WebExceptionStatuNameResolutionFailure)) //连时 || 域名解析失败
            {
                return false;
            }
            if(actualException is SocketException)//网络中断
            {
                return true;
            }
            var retryExceptions = ne WebExceptionStatus[]
            {
                WebExceptionStatuConnectFailure,
                WebExceptionStatuConnectionClosed,
                WebExceptionStatuRequestCanceled
            };
            if (actualException is WebException webException &webException.Status.Is(retryExceptions))//连接失败,是需要其他status?如果不需要,该方法只返回false的场景
            {
                return true;
            }
            
        }
    }
    return true;
}

// 摘要:
//     Defines status codes for the System.NetWebException class.
public enum WebExceptionStatus
{
    //
    // 摘要:
    //     No error was encountered.
    Success = 0,
    //
    // 摘要:
    //     The name resolver service could notresolve the host name.
    NameResolutionFailure = 1,
    //
    // 摘要:
    //     The remote service point could not becontacted at the transport level.
    ConnectFailure = 2,
    //
    // 摘要:
    //     A complete response was not receivedfrom the remote server.
    ReceiveFailure = 3,
    //
    // 摘要:
    //     A complete request could not be sent tothe remote server.
    SendFailure = 4,
    //
    // 摘要:
    //     The request was a pipelined request andthe connection was closed before the
    //     response was received.
    PipelineFailure = 5,
    //
    // 摘要:
    //     The request was canceled, the SystemNet.WebRequest.Abort method was called,
    //     or an unclassifiable error occurred.This is the default value for System.NetWebException.Status.
    RequestCanceled = 6,
    //
    // 摘要:
    //     The response received from the serverwas complete but indicated a protocol-level
    //     error. For example, an HTTP protocolerror such as 401 Access Denied would use
    //     this status.
    ProtocolError = 7,
    //
    // 摘要:
    //     The connection was prematurely closed.
    ConnectionClosed = 8,
    //
    // 摘要:
    //     A server certificate could not bevalidated.
    TrustFailure = 9,
    //
    // 摘要:
    //     An error occurred while establishing aconnection using SSL.
    SecureChannelFailure = 10,
    //
    // 摘要:
    //     The server response was not a validHTTP response.
    ServerProtocolViolation = 11,
    //
    // 摘要:
    //     The connection for a request thatspecifies the Keep-alive header was closed
    //     unexpectedly.
    KeepAliveFailure = 12,
    //
    // 摘要:
    //     An internal asynchronous request ispending.
    Pending = 13,
    //
    // 摘要:
    //     No response was received during thetime-out period for a request.
    Timeout = 14,
    //
    // 摘要:
    //     The name resolver service could notresolve the proxy host name.
    ProxyNameResolutionFailure = 15,
    //
    // 摘要:
    //     An exception of unknown type hasoccurred.
    UnknownError = 16,
    //
    // 摘要:
    //     A message was received that exceededthe specified limit when sending a request
    //     or receiving a response from the server.
    MessageLengthLimitExceeded = 17,
    //
    // 摘要:
    //     The specified cache entry was not found.
    CacheEntryNotFound = 18,
    //
    // 摘要:
    //     The request was not permitted by thecache policy. In general, this occurs when
    //     a request is not cacheable and theeffective policy prohibits sending the request
    //     to the server. You might receive thisstatus if a request method implies the
    //     presence of a request body, a requestmethod requires direct interaction with
    //     the server, or a request contains aconditional header.
    RequestProhibitedByCachePolicy = 19,
    //
    // 摘要:
    //     This request was not permitted by theproxy.
    RequestProhibitedByProxy = 20
}

参考地址

你可能感兴趣的:(.Net日常工作问题,c#,.net)