Web API 空白参数值被转换为 null
Web API whitespace parameter value being converted to null
我有一个简单的网络 API 服务。大约有 10 种不同的 GET 操作,这些 return 是基于输入参数的各种数据库记录的 JSON 输出。
对于一个特定端点,单个 space、“ ”应该是一个有效参数,但它正在被转换为 null。有解决办法吗?
例如 URL 是:http://localhost:1234/DataAccess/RetrieveProductData?parameterOne=null¶meterTwo=574&problemParameter=%20¶meterThree=AB12
在控制器操作中我可以看到以下内容:
int? parameterOne => null
string parameterTwo => "574"
string problemParameter => null
string parameterThree => "AB12"
有没有办法实际得到:
string problemParameter => " "
或者这是不可能的?
您应该在客户端应用程序中执行此操作。您要在 Android 上反序列化它吗?
我通过添加一个 ParameterBindingRule
来解决这个问题,该 ParameterBindingRule
具有足够的条件来匹配我遇到问题的确切参数:
注册码:
config.ParameterBindingRules.Add(p =>
{
// Override rule only for string and get methods, Otherwise let Web API do what it is doing
// By default if the argument is only whitespace, it will be set to null. This fixes that
// commissionOption column default value is a single space ' '.
// Therefore a valid input parameter here is a ' '. By default this is converted to null. This overrides default behaviour.
if (p.ParameterType == typeof(string) && p.ActionDescriptor.SupportedHttpMethods.Contains(HttpMethod.Get) && p.ParameterName == "commissionOption")
{
return new StringParameterBinding(p);
}
return null;
});
StringParameterBinding.cs:
public StringParameterBinding(HttpParameterDescriptor parameter)
: base(parameter)
{
}
public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)
{
var value = actionContext.Request.GetQueryNameValuePairs().Where(f => f.Key == this.Descriptor.ParameterName).Select(s => s.Value).FirstOrDefault();
// By default if the argument is only whitespace, it will be set to null. This fixes that
actionContext.ActionArguments[this.Descriptor.ParameterName] = value;
var tsc = new TaskCompletionSource<object>();
tsc.SetResult(null);
return tsc.Task;
}
我有一个简单的网络 API 服务。大约有 10 种不同的 GET 操作,这些 return 是基于输入参数的各种数据库记录的 JSON 输出。
对于一个特定端点,单个 space、“ ”应该是一个有效参数,但它正在被转换为 null。有解决办法吗?
例如 URL 是:http://localhost:1234/DataAccess/RetrieveProductData?parameterOne=null¶meterTwo=574&problemParameter=%20¶meterThree=AB12
在控制器操作中我可以看到以下内容:
int? parameterOne => null
string parameterTwo => "574"
string problemParameter => null
string parameterThree => "AB12"
有没有办法实际得到:
string problemParameter => " "
或者这是不可能的?
您应该在客户端应用程序中执行此操作。您要在 Android 上反序列化它吗?
我通过添加一个 ParameterBindingRule
来解决这个问题,该 ParameterBindingRule
具有足够的条件来匹配我遇到问题的确切参数:
注册码:
config.ParameterBindingRules.Add(p =>
{
// Override rule only for string and get methods, Otherwise let Web API do what it is doing
// By default if the argument is only whitespace, it will be set to null. This fixes that
// commissionOption column default value is a single space ' '.
// Therefore a valid input parameter here is a ' '. By default this is converted to null. This overrides default behaviour.
if (p.ParameterType == typeof(string) && p.ActionDescriptor.SupportedHttpMethods.Contains(HttpMethod.Get) && p.ParameterName == "commissionOption")
{
return new StringParameterBinding(p);
}
return null;
});
StringParameterBinding.cs:
public StringParameterBinding(HttpParameterDescriptor parameter)
: base(parameter)
{
}
public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)
{
var value = actionContext.Request.GetQueryNameValuePairs().Where(f => f.Key == this.Descriptor.ParameterName).Select(s => s.Value).FirstOrDefault();
// By default if the argument is only whitespace, it will be set to null. This fixes that
actionContext.ActionArguments[this.Descriptor.ParameterName] = value;
var tsc = new TaskCompletionSource<object>();
tsc.SetResult(null);
return tsc.Task;
}