无法让 RestSharp 将对象的参数发送到 Web api 控制器(始终为空)?
Cannot make RestSharp send parameter of object to web api controller (always null)?
我有一个像这样的简单控制器方法:
public IEnumerable<IEntity> GetEntities(ParamsModel args)
{
//set break point here to examine the args
return null;
}
这是我的 ParamsModel
:
public class ParamsModel {
public string Test;
}
这是我的客户发送获取请求的方法:
//_client here is an instance of RestClient
public async Task<IEnumerable<T>> GetEntitiesAsync()
{
var request = new RestRequest("somePath");
var o = new {
Test = "OK"
};
request.AddJsonBody(o);
return await _client.GetAsync<List<T>>(request);
}
在 运行 方法 GetEntitiesAsync
之后,命中断点(在控制器的方法中)。但是 args
是空的,真的吗?
我也试过以下方法:
public async Task<IEnumerable<T>> GetEntitiesAsync()
{
var request = new RestRequest("somePath");
request.AddParameter("Test", "OK");
return await _client.GetAsync<List<T>>(request);
}
但是效果不佳(args
在控制器的方法中为空)。
如果我将控制器的方法更改为类似这样的方法(并使用上面的客户端代码),我可以在控制器的方法中看到字符串的单个简单参数的值已解析为 OK ("OK"):
public IEnumerable<IEntity> GetEntities(string Test)
{
//here we can see that Test has value of "OK"
return null;
}
我真的不明白我的代码有什么问题。
实际上我至少在一年前使用 RestSharp
但现在它似乎有一些新方法(例如我在代码中使用的 GetAsync
),就像我之前使用 Execute
和 ExecuteAsync
.
你能发现这里有什么问题吗?谢谢!
PS:我正在使用 RestSharp 106.6.7
更新操作以使用 [FromUri]
明确说明在何处查找和绑定数据
public IHttpActionResult GetEntities([FromUri]ParamsModel args) {
//...
return Ok(entities);
}
To force Web API to read a complex type from the URI, add the [FromUri]
attribute to the parameter.
引用Parameter Binding in ASP.NET Web API
AddParameter
的例子
public async Task<IEnumerable<T>> GetEntitiesAsync() {
var request = new RestRequest("somePath");
request.AddParameter("Test", "OK");
return await _client.GetAsync<List<T>>(request);
}
现在应该可以工作了。
注意模型应该使用属性而不是字段
public class ParamsModel {
public string Test { get; set; }
}
我有一个像这样的简单控制器方法:
public IEnumerable<IEntity> GetEntities(ParamsModel args)
{
//set break point here to examine the args
return null;
}
这是我的 ParamsModel
:
public class ParamsModel {
public string Test;
}
这是我的客户发送获取请求的方法:
//_client here is an instance of RestClient
public async Task<IEnumerable<T>> GetEntitiesAsync()
{
var request = new RestRequest("somePath");
var o = new {
Test = "OK"
};
request.AddJsonBody(o);
return await _client.GetAsync<List<T>>(request);
}
在 运行 方法 GetEntitiesAsync
之后,命中断点(在控制器的方法中)。但是 args
是空的,真的吗?
我也试过以下方法:
public async Task<IEnumerable<T>> GetEntitiesAsync()
{
var request = new RestRequest("somePath");
request.AddParameter("Test", "OK");
return await _client.GetAsync<List<T>>(request);
}
但是效果不佳(args
在控制器的方法中为空)。
如果我将控制器的方法更改为类似这样的方法(并使用上面的客户端代码),我可以在控制器的方法中看到字符串的单个简单参数的值已解析为 OK ("OK"):
public IEnumerable<IEntity> GetEntities(string Test)
{
//here we can see that Test has value of "OK"
return null;
}
我真的不明白我的代码有什么问题。
实际上我至少在一年前使用 RestSharp
但现在它似乎有一些新方法(例如我在代码中使用的 GetAsync
),就像我之前使用 Execute
和 ExecuteAsync
.
你能发现这里有什么问题吗?谢谢!
PS:我正在使用 RestSharp 106.6.7
更新操作以使用 [FromUri]
public IHttpActionResult GetEntities([FromUri]ParamsModel args) {
//...
return Ok(entities);
}
To force Web API to read a complex type from the URI, add the
[FromUri]
attribute to the parameter.
引用Parameter Binding in ASP.NET Web API
AddParameter
public async Task<IEnumerable<T>> GetEntitiesAsync() {
var request = new RestRequest("somePath");
request.AddParameter("Test", "OK");
return await _client.GetAsync<List<T>>(request);
}
现在应该可以工作了。
注意模型应该使用属性而不是字段
public class ParamsModel {
public string Test { get; set; }
}