2014-03-05 48 views
2

我正在創建對象並將它們發佈到webapi。基本上我只是無法獲得序列化的東西,以便在json中包含$ type信息。以下是我正在嘗試編寫的代碼。之後是我期望的json。

 var cds = new List<CreditDefaultSwaps>() 
     { 
      new CreditDefaultSwaps() { ModelNumber = "SP8A1ETA", BrokerSpread = 0}, 
      new CreditDefaultSwaps() { ModelNumber = "SP3A0TU1", BrokerSpread = 0}, 
      new CreditDefaultSwaps() { ModelNumber = "SP4A102V", BrokerSpread = 0} 
     }; 

     var client = new HttpClient {BaseAddress = new Uri("http://localhost/BloombergWebAPI/api/")}; 

     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     // set up request object 
     var oContract = new WebApiDataServiceRequest 
     { 
      RequestType = ReferenceDataRequestServiceTypes.ReferenceDataRequest, 
      SwapType = BloombergWebAPIMarshal.SwapType.CDS, 
      SecurityList = cds 
     }; 

     Tried something like this and the var content was formatted as I would expect 
     however I couldn't post the data using postasjsonasync 

     //var content = JsonConvert.SerializeObject(oContract, Formatting.Indented, 
     // new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects }); 

      Console.ReadLine(); 

     var response = client.PostAsJsonAsync("bloombergapi/processbloombergrequest", oContract).Result; 

以下是我試圖發佈的json。上面的代碼中我錯過了什麼,我確定這是愚蠢的。

{ 
     "$type": "BloombergWebAPIMarshal.WebApiDataServiceRequest, BloombergWebAPIMarshal", 
     "RequestType": 3, 
     "SwapType": 1, 
     "SecurityList": [ 
     { 
      "$type": "BloombergWebAPIMarshal.CreditDefaultSwaps, BloombergWebAPIMarshal", 
      "ModelNumber": "SP8A1ETA", 
      "BrokerSpread": 0 
     }, 
     { 
      "$type": "BloombergWebAPIMarshal.CreditDefaultSwaps, BloombergWebAPIMarshal", 
      "ModelNumber": "SP3A0TU1", 
      "BrokerSpread": 0 
     }, 
     { 
      "$type": "BloombergWebAPIMarshal.CreditDefaultSwaps, BloombergWebAPIMarshal", 
      "ModelNumber": "SP4A102V", 
      "BrokerSpread": 0 
     } 
     ] 
    } 

回答

3

創建用於該調用產生適當的請求的另一個超載:

var response = client.PostAsJsonAsync("processbloombergrequest", oContract, TypeNameHandling.Objects).Result 

這是新的過載

public static Task<HttpResponseMessage> PostAsJsonAsync<T>(this HttpClient client, string requestUri, T value, TypeNameHandling typeNameHandling) 
{ 

    return client.PostAsJsonAsync<T>(requestUri, value, CancellationToken.None, typeNameHandling); 
} 

public static Task<HttpResponseMessage> PostAsJsonAsync<T>(this HttpClient client, string requestUri, T value, CancellationToken cancellationToken, TypeNameHandling typeNameHandling) 
{ 
    var formatter = new JsonMediaTypeFormatter 
    { 
     SerializerSettings = new JsonSerializerSettings() 
     { 
      TypeNameHandling = typeNameHandling 
     } 
    }; 

    return client.PostAsync<T>(requestUri, value, formatter, cancellationToken); 
}