2016-06-14 36 views
0

我正在向WebApi方法發佈對象。我使用PostAsJsonAsync來做到這一點。PostAsJsonAsync後的WebApi方法中的對象null

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方法中爲空。我似乎無法解決爲什麼我所遵循的所有例子都使用這種格式。

爲什麼調用對象不能被web api拾取?

編輯

這裏是ServiceCall對象。它位於單獨的類庫中,並且Web應用程序和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

他沒有得到一個異常消息,只是接收null,發生在我身上幾次,它可能有不同的原因。既然你說方法的相同簽名在其他情況下有效,我會問你是否發送和接收完全相同的sams類型,或者只是具有相同名稱的類,但是在不同的命名空間中。如果第二個變體,請檢查您是否將TypeNameHandling設置爲auto或全部,我想在Global配置中,如果我還記得的話。 – meJustAndrew

回答

0

使用前綴Stackify我能診斷該串行器被拋出異常:

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 

然而,非常有益,而不是告訴我,控制器發生異常簡單地給了我一個空目的。

正如例外情況所暗示的,解決方案是添加一個默認構造函數(或者至少有一個serialiser可以理解)。

public ServiceCall() 
{ 

} 
0

看起來像JSON序列化可能會失敗。順便說一句,刪除[FromBody]並嘗試沒有它像下面。 PostAsJsonAsync方法將ServiceCall對象序列化爲JSON,然後在POST請求中發送JSON負載。

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

我已經試過了,沒有'[FromBody]',因爲它是我最初無法使用時添加的。但是,我看到很多例子都使用它。 – Jon