RestSharp 调用我的 WebApi 参数为空
RestSharp calling my WebApi parameter is blank
- RestSharp 105.2.3
- WebAPI 2
所以我有一个简单的 WebApi 控制器:
public class EnettController : ApiController
{
private readonly DebitService _EnettService;
public EnettController()
{
_EnettService = new DebitService();
}
[HttpPost]
public ProcessDirectDebitResponse ProcessDirectDebit([FromBody] ProcessDirectDebitRequest aRequest)
{
}
}
从我的测试工具中,我使用以下 RestSharp 代码调用它:
RestClient client = new RestClient($"http://{txtHost.Text}:{txtPort.Text}");
ProcessDirectDebitRequest dataForRequest = new ProcessDirectDebitRequest
{
AgentId = "James Bond",
DepartureDate = DateTime.Now,
Version = "123"
};
RestRequest request = new RestRequest("api/Enett", Method.POST)
{
RequestFormat = DataFormat.Json
};
request.AddHeader("Accept", "application/json");
request.AddHeader("Content-Type", "application/json; charset=utf-8");
request.AddBody(dataForRequest);
IRestResponse<ProcessDirectDebitResponse> response = client.Execute<ProcessDirectDebitResponse>(request);
if (response.StatusCode != HttpStatusCode.OK)
{
MessageBox.Show($"Did not yet a 200 response. Got instead {response.StatusCode}");
}
我的 WebAPI 端点没有问题,但 aRequest 始终为 NULL。所以我在这里遗漏了一些明显的东西,我只是看不到它是什么。为什么 aRequest 总是 NULL?
这里的问题原来是 ProcessDirectDebitRequest class 被装饰为 [Serializable] 导致预期以下有效负载:
{
"<AgentId>k__BackingField": "sample string 1",
"<DepartureDate>k__BackingField": "2017-02-22T12:01:25.8332359+11:00",
"<Version>k__BackingField": "sample string 3"
}
而不是预期的是:
{
"AgentId": "sample string 1",
"DepartureDate": "2017-02-22T12:01:25.8332359+11:00",
"Version": "sample string 3"
}
根据您的需要,有几种解决方法:
- 不要用[序列化]修饰
- 使用config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings(); //删除支持字段并保留 [Serialize]
- 明确使用[DataContract]、[DataMember]
- RestSharp 105.2.3
- WebAPI 2
所以我有一个简单的 WebApi 控制器:
public class EnettController : ApiController
{
private readonly DebitService _EnettService;
public EnettController()
{
_EnettService = new DebitService();
}
[HttpPost]
public ProcessDirectDebitResponse ProcessDirectDebit([FromBody] ProcessDirectDebitRequest aRequest)
{
}
}
从我的测试工具中,我使用以下 RestSharp 代码调用它:
RestClient client = new RestClient($"http://{txtHost.Text}:{txtPort.Text}");
ProcessDirectDebitRequest dataForRequest = new ProcessDirectDebitRequest
{
AgentId = "James Bond",
DepartureDate = DateTime.Now,
Version = "123"
};
RestRequest request = new RestRequest("api/Enett", Method.POST)
{
RequestFormat = DataFormat.Json
};
request.AddHeader("Accept", "application/json");
request.AddHeader("Content-Type", "application/json; charset=utf-8");
request.AddBody(dataForRequest);
IRestResponse<ProcessDirectDebitResponse> response = client.Execute<ProcessDirectDebitResponse>(request);
if (response.StatusCode != HttpStatusCode.OK)
{
MessageBox.Show($"Did not yet a 200 response. Got instead {response.StatusCode}");
}
我的 WebAPI 端点没有问题,但 aRequest 始终为 NULL。所以我在这里遗漏了一些明显的东西,我只是看不到它是什么。为什么 aRequest 总是 NULL?
这里的问题原来是 ProcessDirectDebitRequest class 被装饰为 [Serializable] 导致预期以下有效负载:
{
"<AgentId>k__BackingField": "sample string 1",
"<DepartureDate>k__BackingField": "2017-02-22T12:01:25.8332359+11:00",
"<Version>k__BackingField": "sample string 3"
}
而不是预期的是:
{
"AgentId": "sample string 1",
"DepartureDate": "2017-02-22T12:01:25.8332359+11:00",
"Version": "sample string 3"
}
根据您的需要,有几种解决方法:
- 不要用[序列化]修饰
- 使用config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings(); //删除支持字段并保留 [Serialize]
- 明确使用[DataContract]、[DataMember]