Пример #1
0
        /// <summary>
        ///     通过Post调用
        /// </summary>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="apiName"></param>
        /// <param name="form"></param>
        /// <returns></returns>
        public ApiResult <TResult> Post <TResult>(string apiName, string form)
            where TResult : IApiResultData
        {
            LogRecorder.BeginStepMonitor("内部API调用" + ToUrl(apiName));

            var ctx = string.IsNullOrEmpty(Bearer) ? null : $"Bearer {Bearer}";

            LogRecorder.MonitorTrace(ctx);
            LogRecorder.MonitorTrace("Arguments:" + form);

            var req = (HttpWebRequest)WebRequest.Create(ToUrl(apiName));

            req.Method      = "POST";
            req.ContentType = "application/x-www-form-urlencoded";
            req.Headers.Add(HttpRequestHeader.Authorization, ctx);

            try
            {
                using (var rs = req.GetRequestStream())
                {
                    var formData = Encoding.UTF8.GetBytes(form);
                    rs.Write(formData, 0, formData.Length);
                }
            }
            catch (Exception e)
            {
                LogRecorder.Exception(e);
                LogRecorder.EndStepMonitor();
                return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError));
            }

            return(GetResult <TResult>(req));
        }
        public async Task <string> Create()
        {
            ApiResult result;

            try
            {
                using StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8);
                var body = await reader.ReadToEndAsync();

                var api = JsonConvert.DeserializeObject <Api>(body, new JsonSerializerSettings
                {
                    NullValueHandling = NullValueHandling.Ignore
                });

                if (api != null)
                {
                    api.Id = Guid.NewGuid();
                    await _context.Apis.AddAsync(api);

                    await _context.SaveChangesAsync();

                    result = ApiResult.SucceedResult <Api>(api);
                }
                else
                {
                    result = ApiResult.ErrorResult("Api creation error 1", "api is not serialized");
                }
            }
            catch (Exception e)
            {
                result = ApiResult.ErrorResult("Api creation error 2", $"{e.Message} - {e.InnerException} - {e.StackTrace}");
            }

            return(JsonConvert.SerializeObject(result));
        }
        public async Task <string> GetApis(int page = 1, int size = 10, string filter = null)
        {
            ApiResult result;

            try
            {
                var paginationData = await GetApisForPagination(page, size, filter);

                var methods = await GetMethods(paginationData.Item1);

                var listOfDto = new List <ApiDto>();
                foreach (var api in paginationData.Item1)
                {
                    var dto = _mapper.Map <ApiDto>(api);
                    if (methods.TryGetValue(dto.Id, out var concreteMethods))
                    {
                        dto.Methods = concreteMethods;
                    }

                    listOfDto.Add(dto);
                }

                var paginationDto = new SimplePaginationDto <ApiDto>(listOfDto, page, size, paginationData.Item2, filter);
                result = ApiResult.SucceedResult <SimplePaginationDto <ApiDto> >(paginationDto);
            }
            catch (Exception e)
            {
                result = ApiResult.ErrorResult("Api fetching error 1", $"{e.Message} - {e.InnerException} - {e.StackTrace}");
            }

            return(JsonConvert.SerializeObject(result));
        }
 public override void OnException(ExceptionContext context)
 {
     context.ExceptionHandled = true;
     context.Result           = new ObjectResult(ApiResult.ErrorResult(context.Exception.Message))
     {
         StatusCode = context.Exception is ApiServiceException || context.Exception is InvalidOperationException ? 400 : 500
     };
 }
Пример #5
0
        public ApiResult GetErrorResultFromModelState(ModelStateDictionary modelState)
        {
            IEnumerable <ApiError> errors = modelState.Values
                                            .SelectMany(s => s.Errors)
                                            .Select(e => new ApiError {
                Message = e.ErrorMessage
            });

            return(ApiResult.ErrorResult(errors));
        }
Пример #6
0
        public virtual ApiResult GetErrorResultFromModelState(ModelStateDictionary modelState)
        {
            modelState.CheckArgumentNull(nameof(modelState));

            IEnumerable <ApiError> errors = modelState.Values
                                            .SelectMany(s => s.Errors)
                                            .Select(e => new ApiError {
                Message = e.ErrorMessage
            });

            return(ApiResult.ErrorResult(errors));
        }
        public async Task <string> Add10Apis()
        {
            ApiResult result;
            var       apis = new List <Api>();

            try
            {
                foreach (var index in Enumerable.Range(1, 11))
                {
                    var api    = new Api();
                    var random = new Random();
                    var temp   = random.Next(0, 999);

                    api.Id = Guid.NewGuid();

                    var isOdd      = temp % 2 == 0;
                    var partOfName = isOdd ? "Odd api, by crazy maniacs." : "Vovel api, beauty is here!";
                    api.Name = $"{index} Api. {partOfName}";

                    if (isOdd)
                    {
                        api.IsFree = true;
                    }
                    else
                    {
                        api.IsFree     = false;
                        api.AccessCost = random.Next(1, 10000);
                        if (temp % 8 == 0)
                        {
                            api.MonthlyCost = random.Next(1, 10000);
                        }
                    }

                    api.License = $"APACHIK {index}.0";
                    api.AdditionalAccessRules = "do nothing";
                    api.Description           = StringHelper.RandomString(random.Next(25, 1589));

                    await _context.Apis.AddAsync(api);

                    await _context.SaveChangesAsync();

                    apis.Add(api);
                }

                result = ApiResult.SucceedResult <List <Api> >(apis);
            }
            catch (Exception e)
            {
                result = ApiResult.ErrorResult("Api creation error 2", $"{e.Message} - {e.InnerException} - {e.StackTrace}");
            }

            return(JsonConvert.SerializeObject(result));
        }
Пример #8
0
        /// <summary>
        ///     通过Post调用
        /// </summary>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="apiName"></param>
        /// <param name="form"></param>
        /// <returns></returns>
        public ApiResult <TResult> Post <TResult>(string apiName, string form)
            where TResult : IApiResultData
        {
            var req = CreateRequest(apiName, "POST", form);

            LogRecorder.MonitorTrace("Form:" + form);
            try
            {
            }
            catch (Exception e)
            {
                LogRecorder.Exception(e);
                LogRecorder.EndStepMonitor();
                return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError));
            }

            return(GetResult <TResult>(req));
        }
Пример #9
0
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            base.OnActionExecuting(context);

            Type   entityType = EntityType ?? GetEntityTypeFromContext(context);
            string idStr      = (string)context.RouteData.Values["id"];

            if (entityType != null && !string.IsNullOrEmpty(idStr))
            {
                Guid   id             = new Guid(idStr);
                Type   repositoryType = typeof(IRepository <>).MakeGenericType(entityType);
                object repository     =
                    context.HttpContext.RequestServices.GetService(repositoryType);
                IQueryable <IIdentifiable> entities = GetEntitiesFromRepository(repositoryType, repository);
                if (!entities.Any(entity => entity.Id == id))
                {
                    context.Result = new NotFoundObjectResult(ApiResult.ErrorResult(new ApiError {
                        Message = "Not found"
                    }));
                }
            }
        }
        public async Task <string> Delete(Guid id)
        {
            ApiResult result;

            try
            {
                var api = await _context.Apis.FindAsync(id);

                _context.Remove(api);
                await _context.SaveChangesAsync();

                var keyValue = new Dictionary <string, Guid> {
                    { "deletedId", id }
                };
                result = ApiResult.SucceedResult <Dictionary <string, Guid> >(keyValue);
            }
            catch (Exception e)
            {
                result = ApiResult.ErrorResult("Api deleting error", $"{e.Message} - {e.InnerException} - {e.StackTrace}");
            }

            return(JsonConvert.SerializeObject(result));
        }
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            base.OnActionExecuting(context);

            Type   entityType = EntityType ?? GetEntityTypeFromContext(context);
            string idStr      = (string)context.RouteData.Values["id"];

            if (entityType != null && !string.IsNullOrEmpty(idStr))
            {
                Guid         id               = new Guid(idStr);
                Type         repositoryType   = typeof(IRepository <>).MakeGenericType(entityType);
                PropertyInfo entitiesProperty = repositoryType.GetProperty("Entities");
                object       repository       =
                    context.HttpContext.RequestServices.GetService(repositoryType);
                IQueryable <BaseEntity> entities = (IQueryable <BaseEntity>)entitiesProperty.GetValue(repository);
                if (!entities.Any(entity => entity.Id == id))
                {
                    context.Result = new JsonResult(ApiResult.ErrorResult(new ApiError {
                        Message = "Not found"
                    }));
                    context.HttpContext.Response.StatusCode = 404;
                }
            }
        }
Пример #12
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMediatR(Assembly.GetExecutingAssembly(), typeof(IIndexingQueue).Assembly);
            services.AddSignalR();
            services.AddCoreServices();
            services.AddEsDocumentStorage();

            services.AddAuthentication(
                opt =>
            {
                opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                opt.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(opt =>
            {
                opt.RequireHttpsMetadata      = false;
                opt.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidIssuer              = JwtAuthOptions.Issuer,
                    ValidateAudience         = true,
                    ValidAudience            = JwtAuthOptions.Audience,
                    ValidateLifetime         = true,
                    IssuerSigningKey         = JwtAuthOptions.SigningKey,
                    ValidateIssuerSigningKey = true
                };

                opt.Events = new JwtBearerEvents
                {
                    OnMessageReceived = context =>
                    {
                        var accessToken = context.Request.Query["access_token"];

                        var path = context.HttpContext.Request.Path;
                        if (!string.IsNullOrEmpty(accessToken) && path.StartsWithSegments("/signalr"))
                        {
                            context.Token = accessToken;
                        }

                        return(Task.CompletedTask);
                    }
                };
            });

            services
            .AddMvc(opt =>
            {
                opt.EnableEndpointRouting = false;
                opt.Filters.Add(new ApiExceptionFilterAttribute());
                opt.ModelBinderProviders.Insert(0, new ObjectsModelBinderProvider());
            })
            .SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
            .ConfigureApiBehaviorOptions(opt =>
            {
                opt.InvalidModelStateResponseFactory = context => new BadRequestObjectResult(
                    ApiResult.ErrorResult(context.ModelState.Where(x => x.Value.Errors.Any()).Select(x => x.Value.Errors.First().ErrorMessage).ToArray()));
            });

            services.AddHostedService <TempContentBackgroundService>();

            services.AddScoped <ITempContentStorage, TempContentStorage>();
            services.AddScoped <IUserService, UserService>();

            services.AddSingleton <DocumentIdentityModelBinder>();
            services.AddSingleton <FolderIdentityModelBinder>();
            services.AddSingleton <IContentTypeProvider, FileExtensionContentTypeProvider>();

            services.Configure <CoreOptions>(Configuration);
            services.Configure <IndexingQueueOptions>(Configuration.GetSection("indexingQueue"));
            services.Configure <ContentStorageOptions>(Configuration.GetSection("contentStorage"));
            services.Configure <TempContentStorageOptions>(Configuration.GetSection("tempContentStorage"));
            services.Configure <DocumentStorageOptions>(Configuration.GetSection("documentStorage"));
        }
Пример #13
0
 public ApiResult GetErrorResultFromException(Exception exception)
 {
     return(ApiResult.ErrorResult(new[] { GetApiErrorFromException(exception) }));
 }
Пример #14
0
        /// <summary>
        ///     取返回值
        /// </summary>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="req"></param>
        /// <returns></returns>
        public ApiResult <TResult> GetResult <TResult>(HttpWebRequest req)
            where TResult : IApiResultData
        {
            string jsonResult;

            try
            {
                using (var response = req.GetResponse())
                {
                    var receivedStream = response.GetResponseStream();
                    if (receivedStream != null)
                    {
                        var streamReader = new StreamReader(receivedStream);
                        jsonResult = streamReader.ReadToEnd();
                        receivedStream.Dispose();
                    }
                    else
                    {
                        LogRecorder.EndStepMonitor();
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.UnknowError, "服务器无返回值"));
                    }
                    response.Close();
                }
            }
            catch (WebException e)
            {
                if (e.Status != WebExceptionStatus.ProtocolError)
                {
                    LogRecorder.EndStepMonitor();
                    switch (e.Status)
                    {
                    case WebExceptionStatus.CacheEntryNotFound:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError, "找不到指定的缓存项"));

                    case WebExceptionStatus.ConnectFailure:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError, "在传输级别无法联系远程服务点"));

                    case WebExceptionStatus.ConnectionClosed:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError, "过早关闭连接"));

                    case WebExceptionStatus.KeepAliveFailure:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError, "指定保持活动状态的标头的请求的连接意外关闭"));

                    case WebExceptionStatus.MessageLengthLimitExceeded:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError,
                                                                "已收到一条消息的发送请求时超出指定的限制或从服务器接收响应"));

                    case WebExceptionStatus.NameResolutionFailure:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError, "名称解析程序服务或无法解析主机名"));

                    case WebExceptionStatus.Pending:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError, "内部异步请求处于挂起状态"));

                    case WebExceptionStatus.PipelineFailure:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError, "该请求是管线请求和连接被关闭之前收到响应"));

                    case WebExceptionStatus.ProxyNameResolutionFailure:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError, "名称解析程序服务无法解析代理服务器主机名"));

                    case WebExceptionStatus.ReceiveFailure:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError, "从远程服务器未收到完整的响应"));

                    case WebExceptionStatus.RequestCanceled:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError, "请求已取消"));

                    case WebExceptionStatus.RequestProhibitedByCachePolicy:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError, "缓存策略不允许该请求"));

                    case WebExceptionStatus.RequestProhibitedByProxy:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError, "由该代理不允许此请求"));

                    case WebExceptionStatus.SecureChannelFailure:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError, "使用 SSL 建立连接时出错"));

                    case WebExceptionStatus.SendFailure:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError, "无法与远程服务器发送一个完整的请求"));

                    case WebExceptionStatus.ServerProtocolViolation:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError, "服务器响应不是有效的 HTTP 响应"));

                    case WebExceptionStatus.Timeout:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError, "请求的超时期限内未不收到任何响应"));

                    case WebExceptionStatus.TrustFailure:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError, "无法验证服务器证书"));

                    default:
                        //case WebExceptionStatus.UnknownError:
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError, "发生未知类型的异常"));
                    }
                }
                using (var response = e.Response)
                {
                    var receivedStream = response.GetResponseStream();
                    if (receivedStream != null)
                    {
                        var streamReader = new StreamReader(receivedStream);
                        jsonResult = streamReader.ReadToEnd();
                        receivedStream.Dispose();
                    }
                    else
                    {
                        LogRecorder.EndStepMonitor();
                        return(ApiResult <TResult> .ErrorResult(ErrorCode.UnknowError, "服务器无返回值"));
                    }
                    response.Close();
                }
            }
            catch (Exception e)
            {
                LogRecorder.Exception(e);
                LogRecorder.EndStepMonitor();
                return(ApiResult <TResult> .ErrorResult(ErrorCode.NetworkError));
            }
            LogRecorder.MonitorTrace(jsonResult);
            try
            {
                if (string.IsNullOrWhiteSpace(jsonResult))
                {
                    return(ApiResult <TResult> .ErrorResult(ErrorCode.UnknowError));
                }
                return(JsonConvert.DeserializeObject <ApiResult <TResult> >(jsonResult));
            }
            catch (Exception e)
            {
                LogRecorder.Exception(e);
                return(ApiResult <TResult> .ErrorResult(ErrorCode.UnknowError));
            }
            finally
            {
                LogRecorder.EndStepMonitor();
            }
        }
Пример #15
0
        public virtual ApiResult GetErrorResultFromException(Exception exception)
        {
            exception.CheckArgumentNull(nameof(exception));

            return(ApiResult.ErrorResult(GetApiErrorFromException(exception)));
        }