コード例 #1
0
        public virtual BoltServerException TryReadServerError(ClientActionContext context)
        {
            ServerErrorCode?result = TryReadBoltError(context);

            if (result != null)
            {
                return(new BoltServerException(result.Value, context.Action.Name, context.Request.RequestUri.ToString()));
            }

            int?code = TryReadErrorCode(context);

            if (code != null)
            {
                return(new BoltServerException(code.Value, context.Action.Name, context.Request.RequestUri.ToString()));
            }

            if (context.Response?.StatusCode == HttpStatusCode.NotFound)
            {
                return(new BoltServerException(
                           ServerErrorCode.BoltUnavailable,
                           context.Action.Name,
                           context.Request.RequestUri.ToString()));
            }

            return(null);
        }
コード例 #2
0
        public virtual ErrorHandlingResult Handle(ClientActionContext context, Exception e)
        {
            if (context.Proxy.State == ProxyState.Closed)
            {
                return(ErrorHandlingResult.Close);
            }

            if (e is NoServersAvailableException)
            {
                return(ErrorHandlingResult.Recover);
            }

            if ((e as BoltServerException)?.ServerError == ServerErrorCode.ContractNotFound)
            {
                return(ErrorHandlingResult.Close);
            }

            if ((e as BoltServerException)?.ServerError == ServerErrorCode.SessionNotFound)
            {
                return(ErrorHandlingResult.Recover);
            }

            if (e is HttpRequestException)
            {
                return(ErrorHandlingResult.Recover);
            }

            if (e is ProxyClosedException)
            {
                return(ErrorHandlingResult.Close);
            }

            return(ErrorHandlingResult.Rethrow);
        }
コード例 #3
0
ファイル: ErrorHandling.cs プロジェクト: geffzhang/Bolt
        public ErrorHandlingResult Handle(ClientActionContext context, Exception e)
        {
            if (e is NoServersAvailableException)
            {
                return ErrorHandlingResult.Recover;
            }

            if ((e as BoltServerException)?.Error == ServerErrorCode.ContractNotFound)
            {
                return ErrorHandlingResult.Close;
            }

            if ((e as BoltServerException)?.Error == ServerErrorCode.SessionNotFound)
            {
                return ErrorHandlingResult.Recover; 
            }

            if (e is HttpRequestException)
            {
                return ErrorHandlingResult.Recover; 
            }

            if (e is ProxyClosedException)
            {
                return ErrorHandlingResult.Close;
            }

            return ErrorHandlingResult.Rethrow;
        }
コード例 #4
0
ファイル: ProxyBase.cs プロジェクト: yonglehou/Bolt
 public async Task<object> SendAsync(MethodInfo action, params object[] parameters)
 {
     using (ClientActionContext ctxt = new ClientActionContext(this, Contract, action, parameters))
     {
         await Pipeline.Instance(ctxt);
         return ctxt.ActionResult;
     }
 }
コード例 #5
0
ファイル: ProxyBase.cs プロジェクト: iamsingularity/Bolt
 private void ReleaseContext(ClientActionContext context)
 {
     if (_contexts.Count < _poolSize)
     {
         context.Reset();
         _contexts.Enqueue(context);
     }
 }
コード例 #6
0
ファイル: ProxyBase.cs プロジェクト: yonglehou/Bolt
 public async Task OpenAsync()
 {
     using (ClientActionContext ctxt = new ClientActionContext(this, Contract, BoltFramework.SessionMetadata.Resolve(Contract).InitSession.Action, null))
     {
         await Pipeline.Instance(ctxt);
         State = ProxyState.Open;
     }
 }
コード例 #7
0
ファイル: ProxyBase.cs プロジェクト: geffzhang/Bolt
 public async Task OpenAsync()
 {
     using (ClientActionContext ctxt = new ClientActionContext(this, Contract, BoltFramework.GetSessionDescriptor(Contract).InitSession, null))
     {
         await Pipeline.Instance(ctxt);
         State = ProxyState.Open;
     }
 }
コード例 #8
0
ファイル: ProxyBase.cs プロジェクト: iamsingularity/Bolt
        private ClientActionContext CreateContext(ActionMetadata action, params object[] parameters)
        {
            ClientActionContext context;

            if (!_contexts.TryDequeue(out context))
            {
                context = new ClientActionContext();
            }

            context.Init(this, Contract, action, parameters);
            return(context);
        }
コード例 #9
0
ファイル: ProxyBase.cs プロジェクト: iamsingularity/Bolt
        public async Task OpenAsync()
        {
            ClientActionContext ctxt = CreateContext(Contract.Session.InitSession, null);

            try
            {
                await Pipeline.Instance(ctxt).ConfigureAwait(false);

                State = ProxyState.Open;
            }
            finally
            {
                ReleaseContext(ctxt);
            }
        }
コード例 #10
0
ファイル: ProxyBase.cs プロジェクト: iamsingularity/Bolt
        public async Task <object> SendAsync(MethodInfo action, params object[] parameters)
        {
            ClientActionContext ctxt = CreateContext(Contract.GetAction(action), parameters);

            try
            {
                await Pipeline.Instance(ctxt).ConfigureAwait(false);

                return(ctxt.ActionResult);
            }
            finally
            {
                ReleaseContext(ctxt);
            }
        }
コード例 #11
0
ファイル: ServerErrorProvider.cs プロジェクト: geffzhang/Bolt
        protected virtual ServerErrorCode? TryReadBoltError(ClientActionContext context)
        {
            string value = context.Response.Headers.GetHeaderValue(_errorCodeHeader);
            if (string.IsNullOrEmpty(value))
            {
                return null;
            }

            ServerErrorCode code;
            if (Enum.TryParse(value, true, out code))
            {
                return code;
            }

            return null;
        }
コード例 #12
0
ファイル: ServerErrorProvider.cs プロジェクト: geffzhang/Bolt
        protected virtual int? TryReadErrorCode(ClientActionContext context)
        {
            string value = context.Response.Headers.GetHeaderValue(_errorCodeHeader);
            if (string.IsNullOrEmpty(value))
            {
                return null;
            }

            int code;
            if (int.TryParse(value, out code))
            {
                return code;
            }

            return null;
        }
コード例 #13
0
ファイル: ProxyBase.cs プロジェクト: yonglehou/Bolt
        public async Task CloseAsync()
        {
            if (State == ProxyState.Open)
            {
                using (ClientActionContext ctxt = new ClientActionContext(this, Contract, BoltFramework.SessionMetadata.Resolve(Contract).DestroySession.Action, null))
                {
                    await Pipeline.Instance(ctxt);
                    State = ProxyState.Closed;
                }
            }
            else
            {
                State = ProxyState.Closed;
            }

            Dispose();
        }
コード例 #14
0
        protected virtual int?TryReadErrorCode(ClientActionContext context)
        {
            string value = context.Response.Headers.GetHeaderValue(_errorCodeHeader);

            if (string.IsNullOrEmpty(value))
            {
                return(null);
            }

            int code;

            if (int.TryParse(value, out code))
            {
                return(code);
            }

            return(null);
        }
コード例 #15
0
        protected virtual ServerErrorCode?TryReadBoltError(ClientActionContext context)
        {
            string value = context.Response.Headers.GetHeaderValue(_errorCodeHeader);

            if (string.IsNullOrEmpty(value))
            {
                return(null);
            }

            ServerErrorCode code;

            if (Enum.TryParse(value, true, out code))
            {
                return(code);
            }

            return(null);
        }
コード例 #16
0
ファイル: ProxyBase.cs プロジェクト: iamsingularity/Bolt
        public async Task CloseAsync()
        {
            if (State == ProxyState.Open)
            {
                ClientActionContext ctxt = CreateContext(Contract.Session.DestroySession, null);
                try
                {
                    await Pipeline.Instance(ctxt).ConfigureAwait(false);

                    State = ProxyState.Closed;
                }
                finally
                {
                    ReleaseContext(ctxt);
                }
            }
            else
            {
                State = ProxyState.Closed;
            }

            Dispose();
        }
コード例 #17
0
ファイル: ServerErrorProvider.cs プロジェクト: geffzhang/Bolt
        public virtual BoltServerException TryReadServerError(ClientActionContext context)
        {
            ServerErrorCode? result = TryReadBoltError(context);
            if (result != null)
            {
                return new BoltServerException(result.Value, context.Action, context.Request.RequestUri.ToString());
            }

            int? code = TryReadErrorCode(context);
            if (code != null)
            {
                return new BoltServerException(code.Value, context.Action, context.Request.RequestUri.ToString());
            }

            if (context.Response?.StatusCode == HttpStatusCode.NotFound)
            {
                return new BoltServerException(
                    ServerErrorCode.BoltUnavailable,
                    context.Action,
                    context.Request.RequestUri.ToString());
            }

            return null;
        }