Parametr POST AspNet WebApi ma wartość null podczas wysyłania XML

Mam usługę web api pierwotnie używającą bitów beta, które przebudowałem przy użyciu bitów kandydujących do wydania i mam teraz ten problem.

Mam akcję POST, która przyjmuje opcję złożoną jako jedyny parametr. Gdy wysyłam żądanie z ciałem w formacie json, obiekt jest deserializowany zgodnie z oczekiwaniami, ale jeśli zamiast niego wysyłam XML, parametr ma wartość NULL.

W wersji beta pracowałem nad tym, wyłączając wiązanie modelu w sposób opisany w blogu Carlosa FigueiryWyłączanie powiązania modelu na platformie ASP.NET Web APIs Beta

W RC usunęli jednak IRequestContentReadPolicy, którą implementowała ta metoda.

Moja akcja:

public List<Models.Payload> Post([FromBody]Models.AimiRequest requestValues)
{
  try
  {
    if (requestValues == null)
    {
      var errorResponse = new HttpResponseMessage();
      errorResponse.StatusCode = HttpStatusCode.NotFound;
      errorResponse.Content = new StringContent("parameter 'request' is null");
      throw new HttpResponseException(errorResponse);
    }
    var metadataParams = new List<KeyValuePair<string, string>>();
    foreach (Models.MetadataQueryParameter param in requestValues.Metadata)
    {
      metadataParams.Add(new KeyValuePair<string, string>(param.Name, param.Value));
    }
    List<Core.Data.Payload> data = _payloadService.FindPayloads(metadataParams, requestValues.ContentType, requestValues.RuleTypes);
    var retVal = AutoMapper.Mapper.Map<List<Core.Data.Payload>, List<Models.Payload>>(data);
    return retVal; // new HttpResponseMessage<List<Models.Payload>>(retVal);
  }
  catch (System.Exception ex)
  {
    _logger.RaiseError(ex);
    throw;
  }
}

Mój model:

public class AimiRequest
{
  public MetadataQueryParameter[] Metadata { get; set; }
  public string ContentType { get; set; }
  public string RuleTypes { get; set; }
}

public class MetadataQueryParameter
{
  public string Name { get; set; }
  public string Value { get; set; }
}

Testuję używanie Skrzypka do wysyłania żądań do usługi.

To działa i zwraca mi oczekiwane rezultaty.

POST http://localhost:51657/api/search HTTP/1.1
User-Agent: Fiddler
Content-Type: application/json; charset=utf-8
Accept: application/json
Host: localhost:51657
Content-Length: 219

{
  "ContentType":null,
  "RuleTypes":null,
  "Metadata":[
    {
    "Name":"ClientName",
    "Value":"Client One"
    },
    {
    "Name":"ClientName",
    "Value":"Client Two"
    }
  ]
}

To się nie powiedzie, ponieważ parametr requestValues ​​ma wartość NULL

POST http://localhost:51657/api/search HTTP/1.1
User-Agent: Fiddler
Content-Type: application/xml; charset=utf-8
Accept: application/xml
Host: localhost:51657
Content-Length: 213

<AimiRequest>
  <ContentType />
  <RuleTypes />
  <Metadata>
    <MetadataQueryParameter>
      <Name>ClientName</Name>
      <Value>Client One</Value>
    </MetadataQueryParameter>
    <MetadataQueryParameter>
      <Name>ClientName</Name>
      <Value>Client Two</Value>
    </MetadataQueryParameter>
  </Metadata>
</AimiRequest>

questionAnswers(2)

yourAnswerToTheQuestion