Я нашел много информации по этой теме, но ни один из этих сайтов и статей не мог решить мою проблему. У меня довольно простой метод:
[HttpPost, Route("Diagnosis/{lkNo}/Tree/{nodeID:int}/Answer")]
public List<TreeNode> AnswerTreeNode(string lkNo, int nodeID,
[FromBody] dynamic data) {
// So some stuff
}
Когда я вызываю этот метод, он заполняет первые два параметра, но данные всегда равны нулю. Вот мой тестовый запрос, полученный сервером:
POST /Diagnosis/LK-28084453/Tree/0/Answer HTTP/1.1
Cache-Control: no-cache
Connection: keep-alive
Accept: */*
Accept-Encoding: gzip, deflate
Cookie: ASP.NET_SessionId=*****; __RequestVerificationToken=*****
Host: localhost:51124
User-Agent: PostmanRuntime/7.6.0
Postman-Token: *****
Content-Length: 5
Content-Type: application/x-www-form-urlencoded
=Test
Отправка параметра как json приводит к тому же результату:
...
Content-Length: 25
Content-Type: application/json
{ "value": "some value" }
Что бы я ни пытался, данные всегда нулевые. Вот мой конфиг маршрута:
// WebAPI
GlobalConfiguration.Configure(config => {
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DiagnosisApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// Default return JSON
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver =
new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
config.MessageHandlers.Add(new MyHandler());
});
public class MyHandler : System.Net.Http.DelegatingHandler {
protected override async System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage> SendAsync(
System.Net.Http.HttpRequestMessage request,
System.Threading.CancellationToken token) {
System.Net.Http.HttpMessageContent requestContent = new System.Net.Http.HttpMessageContent(request);
string requestMessage = requestContent.ReadAsStringAsync().Result; // This one contains the raw requests as posted abve
return await base.SendAsync(request, token);
}
}
У вас есть идея, что здесь не так?