RestSharp 调用我的 WebApi 参数为空

RestSharp calling my WebApi parameter is blank

所以我有一个简单的 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"
}

根据您的需要,有几种解决方法:

  1. 不要用[序列化]修饰
  2. 使用config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings(); //删除支持字段并保留 [Serialize]
  3. 明确使用[DataContract]、[DataMember]