0

Я отправляю объект в метод WebApi. Я использую PostAsJsonAsync для этого.Объект null в методе WebApi после PostAsJsonAsync

public async Task<HttpResponseMessage> PostAsync(string token, ServiceCall call) 
{ 
    var client = new HttpClient(); 
    client.SetBearerToken(token); 

    var response = await client.PostAsJsonAsync(Uri + "id/nestedcall", call); 

    return response; 
} 

Объект call, что я передаю не равно нулю, когда я его.

[HttpPost] 
[Route("id/nestedcall")] 
public async Task<IHttpActionResult> NestedCall([FromBody]ServiceCall call) 
{ 
    // call is null here 
} 

Однако это недействительно в моем методе API. Я не могу понять, почему, поскольку все примеры, которые я использовал, используют этот формат.

Почему объект вызова не подхвачен веб-api?

Редактировать

Вот ServiceCall объект. Он находится в отдельной библиотеке классов, и ссылка включена как в веб-приложение, так и в API.

public class ServiceCall 
{ 
    public ServiceCall(Service service, string grantType) 
    { 
     ClientId = service.Id; 
     ClientSecret = service.Secret; 
     Uri = service.Uri; 
     Scope = service.Scope; 
     GrantType = grantType; 
    } 

    public ServiceCall(string clientid, string clientsecret, string uri, string scope, string grantType) 
    { 
     ClientId = clientid; 
     ClientSecret = clientsecret; 
     Uri = uri; 
     Scope = scope; 
     GrantType = grantType; 
    } 

    public string ClientId { get; set; } 
    public string ClientSecret { get; set; } 
    public string Uri { get; set; } 
    public string Scope { get; set; } 
    public string GrantType { get; set; } 
} 
+0

Можете ли вы вставить сообщение об исключении. Однако кажется, что ваши привязки к образцам не работают – Arsene

+0

Также запустите его в режиме отладки и введите код, который вы узнаете больше о данных, которые вы отправляете. – Arsene

+0

Он не получает сообщение об исключении, просто получает нуль, случилось со мной несколько раз, и это может иметь разные причины. Поскольку вы говорите, что одна и та же сигнатура методов работает в других случаях, я бы спросил вас, если вы отправляете и получаете точно тип sams, или просто классы с тем же именем, но в разных пространствах имен. Если есть второй вариант, проверьте, есть ли у вас TypeNameHandling для автоматического или для всех, я думаю, в Global config, если я хорошо помню. – meJustAndrew

ответ

0

Использование префикса Stackify Я был в состоянии диагностировать, что serialiser бросает исключение:

Newtonsoft.Json.JsonSerializationException: Unable to find a constructor to use for type Core.Models.ServiceCall. A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute. Path 'ClientId', line 1, position 12. 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateNewObject 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize 

Однако, очень услужливо, а не сказать мне, что произошло исключение контроллер просто дал мне пустой указатель объект.

Как было намечено исключение, решение состоит в том, чтобы добавить конструктор по умолчанию (или, по крайней мере, один, который может понять сериализатор).

public ServiceCall() 
{ 

} 
0

похоже, что сериализация JSON может быть неудачной. BTW, удалите это [FromBody] и попробуйте без него, как показано ниже. Метод PostAsJsonAsync сериализует объект ServiceCall на JSON, а затем отправляет полезную нагрузку JSON в запросе POST.

public async Task<IHttpActionResult> NestedCall(ServiceCall call) 
{ 
    // your code 
} 
+0

Я уже пробовал это без '[FromBody]', поскольку это то, что я добавил, когда он не работал изначально. Однако многие примеры, которые я видел, использовали. – Jon

Смежные вопросы