コード例 #1
0
        public string GetMethodParameterExample(IRpcMethodInfo methodInfo, IRpcParameterInfo parameterInfo)
        {
            var paramNode = this.xpathNavigator.SelectSingleNode(
                $"/doc/members/member[@name='{methodInfo.Name}']/param[@name='{parameterInfo.Name}']");

            if (paramNode == null)
            {
                return(string.Empty);
            }
            var example = paramNode.GetAttribute("example", "");

            return(example);
        }
コード例 #2
0
        private object ParameterGuidValue(IRpcParameterInfo parameter, string stringValue, Type parameterType)
        {
            if (Guid.TryParse(stringValue, out var intValue))
            {
                return(intValue);
            }

            if (parameter.HasDefaultValue)
            {
                return(parameter.DefaultValue);
            }

            if (parameterType == typeof(Guid?))
            {
                return(null);
            }

            throw new Exception($"Could not convert parameter {parameter.Name} value {stringValue} to guid");
        }
コード例 #3
0
        protected virtual object ParameterDoubleValue(IRpcParameterInfo parameter, string stringValue, Type parameterType)
        {
            if (double.TryParse(stringValue, out var intValue))
            {
                return(intValue);
            }

            if (parameter.HasDefaultValue)
            {
                return(parameter.DefaultValue);
            }

            if (parameterType == typeof(double?))
            {
                return(null);
            }

            throw new Exception($"Could not convert parameter {parameter.Name} value {stringValue} to double");
        }
コード例 #4
0
        public object ConvertString(IRpcParameterInfo parameter, string stringValue)
        {
            var parameterType = parameter.ParamType;

            if (parameterType == typeof(string))
            {
                return(stringValue);
            }

            if (parameterType == typeof(int) ||
                parameterType == typeof(int?))
            {
                return(ParameterIntegerValue(parameter, stringValue, parameterType));
            }

            if (parameterType == typeof(double) ||
                parameterType == typeof(double?))
            {
                return(ParameterDoubleValue(parameter, stringValue, parameterType));
            }

            if (parameterType == typeof(decimal) ||
                parameterType == typeof(decimal?))
            {
                return(ParameterDecimalValue(parameter, stringValue, parameterType));
            }

            if (parameterType == typeof(bool) ||
                parameterType == typeof(bool?))
            {
                return(ParameterBooleanValue(parameter, stringValue, parameterType));
            }

            if (parameterType == typeof(Guid) ||
                parameterType == typeof(Guid?))
            {
                return(ParameterGuidValue(parameter, stringValue, parameterType));
            }

            return(Convert.ChangeType(stringValue, parameterType));
        }
コード例 #5
0
 /// <inheritdoc />
 public void BindUrlParameter(RequestExecutionContext context,
                              EndPointMethodConfiguration configuration,
                              IRpcParameterInfo parameter,
                              IRequestParameters parameterContext,
                              ref int currentIndex,
                              in ReadOnlySpan <char> pathSpan)
コード例 #6
0
        protected virtual void BindQueryStringParameter(RequestExecutionContext context, EndPointMethodConfiguration configuration, IRpcParameterInfo parameter, IRequestParameters parameters)
        {
            if (context.HttpContext.Request.Query.TryGetValue(parameter.BindName, out var value))
            {
                var boundValue = _stringValueModelBinder.ConvertString(parameter, value);

                context.Parameters[parameter.Position] = boundValue;
            }
            else if (parameter.HasDefaultValue)
            {
                context.Parameters[parameter.Position] = parameter.DefaultValue;
            }
        }
コード例 #7
0
        private void BindHeaderParameter(RequestExecutionContext context, EndPointMethodConfiguration configuration, IRpcParameterInfo parameter, IRequestParameters parameters)
        {
            if (context.HttpContext.Request.Headers.TryGetValue(parameter.BindName, out var value))
            {
                var boundValue = _stringValueModelBinder.ConvertString(parameter, value);

                parameters[parameter.Position] = boundValue;
            }
            else if (parameter.HasDefaultValue)
            {
                parameters[parameter.Position] = parameter.DefaultValue;
            }
        }
コード例 #8
0
 protected virtual void BindNewData <TValue>(RequestExecutionContext context, EndPointMethodConfiguration configuration, IRpcParameterInfo parameter, IRequestParameters parameterContext) where TValue : new()
 {
     parameterContext[parameter.Position] = new TValue();
 }
コード例 #9
0
        private bool ParametersMatch(RpcRequestSignature requestSignature, IReadOnlyList <IRpcParameterInfo> parameters)
        {
            if (!requestSignature.HasParameters)
            {
                return(parameters == null || !parameters.Any(p => !p.IsOptional));
            }
            int parameterCount = 0;

            if (requestSignature.IsDictionary)
            {
                foreach ((Memory <char> name, RpcParameterType type) in requestSignature.ParametersAsDict)
                {
                    bool found = false;
                    for (int paramIndex = 0; paramIndex < parameters.Count; paramIndex++)
                    {
                        IRpcParameterInfo parameter = parameters[paramIndex];
                        if (!RpcUtil.NamesMatch(parameter.Name.AsSpan(), name.Span) ||
                            !RpcParameterUtil.TypesCompatible(parameter.Type, type))
                        {
                            continue;
                        }
                        found = true;
                        break;
                    }
                    if (!found)
                    {
                        return(false);
                    }
                    parameterCount++;
                }
            }
            else
            {
                foreach (RpcParameterType parameterType in requestSignature.ParametersAsList)
                {
                    if (parameters.Count <= parameterCount)
                    {
                        return(false);
                    }
                    IRpcParameterInfo info = parameters[parameterCount];
                    if (!RpcParameterUtil.TypesCompatible(info.Type, parameterType))
                    {
                        return(false);
                    }

                    parameterCount++;
                }


                for (int i = parameterCount; i < parameters.Count; i++)
                {
                    //Only if the last parameters in the method are optional does the request match
                    //Will be skipped if they are equal length
                    if (!parameters[i].IsOptional)
                    {
                        return(false);
                    }
                }
            }
            if (parameterCount != parameters.Count)
            {
                return(false);
            }
            return(true);
        }
コード例 #10
0
 public virtual void BindHttpCancellationTokenParameter(RequestExecutionContext context,
                                                        EndPointMethodConfiguration endPointMethodConfiguration, IRpcParameterInfo parameter,
                                                        IRequestParameters parameterContext)
 {
     parameterContext[parameter.Position] = context.HttpContext.RequestAborted;
 }
コード例 #11
0
 public virtual void BindHttpResponseParameter(RequestExecutionContext context,
                                               EndPointMethodConfiguration endPointMethodConfiguration, IRpcParameterInfo parameter,
                                               IRequestParameters parameterContext)
 {
     parameterContext[parameter.Position] = context.HttpContext.Response;
 }
コード例 #12
0
 public virtual void BindRequestServicesParameter(RequestExecutionContext context,
                                                  EndPointMethodConfiguration endPointMethodConfiguration, IRpcParameterInfo parameter,
                                                  IRequestParameters parameterContext)
 {
     parameterContext[parameter.Position] = context.HttpContext.RequestServices.GetService(parameter.ParamType);
 }