2017-10-03 8 views
1

J'ai une classe ApiController avec une méthode acceptant un objet complexe.WebApi - Guide envoyé pris comme nouveau guide

public class SampleController : ApiController 
{ 
    [Route("api/Sample/")] 
    [HttpPost] 
    public HttpResponseMessage GetSampleInfo([FromBody]SampleClass sampleClassObject) 
    { 
     // Some code 
    } 
} 

Lorsque le débogage, cette méthode de classe Controller est appelée, mais ce qui a été passé en Guid dans l'objet, montre une nouvelle Guid (comme 00000000-0000-0000-0000-000000000000). Je vérifie d'abord cette méthode avec Postman. J'ai essayé de passer l'objet en utilisant x-www-form-urlencoded et aussi application/json.

Qu'est-ce que je passe dans Postman:

{ 
    "sampleID": "A9A999AA-AA99-9AA9-A999-9999999999AA", 
    "otherValue": 1 
} 

J'ai vérifié d'autres questions comme la mienne, mais je l'ai essayé les solutions mais je reçois le passé Guid comme une nouvelle Guid.

P.S. Le SampleClass ressemble comme suit:

public class SampleClass 
{ 
    public Guid sampleID { get; set; } 
    public int otherValue { get; set; } 
} 

Mise à jour:

J'ai utilisé le JsonConverter suivant.

public class GuidConverterCustom : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return typeof(Guid) == objectType; 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     switch (reader.TokenType) 
     { 
      case JsonToken.Null: 
       return Guid.Empty; 
      case JsonToken.String: 
       string str = reader.Value as string; 
       if (string.IsNullOrEmpty(str)) 
       { 
        return Guid.Empty; 
       } 
       else 
       { 
        return new Guid(str); 
       } 
      default: 
       throw new ArgumentException("Invalid token type"); 
     } 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     if (Guid.Empty.Equals(value)) 
     { 
      writer.WriteValue(""); 
     } 
     else 
     { 
      writer.WriteValue((Guid)value); 
     } 
    } 
} 

et inclus les éléments suivants dans le Global.asax.cs:

JsonConvert.DefaultSettings =() => 
{ 
    var settings = new JsonSerializerSettings(); 
    settings.Converters.Add(new GuidConverterCustom()); 
    return settings; 
}; 
+0

Vous devez ajouter comment 'SampleClass' semble aussi bien. – Ogglas

+0

pouvez-vous afficher la définition de la classe – narekye

+0

@Ogglas Merci. J'ai mis à jour ma question. – Curiousity

Répondre

2

Votre méthode devrait ressembler à ceci, pas besoin de JsonConverter de coutume.

[Route("sample")] 
[HttpPost] 
public IHttpActionResult PostGuid(SampleClass id) 
{ 
    return Ok(); 
} 

Il travaille ensuite avec les deux x-www-form-urlencoded et application/json. Si vous utilisez json, n'oubliez pas l'en-tête Content-Type: application/json.

enter image description here

enter image description here

+0

Merci, mais j'ai essayé ceci avant d'utiliser le convertisseur personnalisé .. Mais encore, il est revenu seulement 0s :( – Curiousity

+1

@ Curiousity Sautez alors Json et utilisez 'x-www-form-urlencoded' Envoyez un message à Postman si cela ne fonctionne pas Rappelez-vous d'effacer les en-têtes lorsque vous changez d'adresse – Ogglas

+0

J'ai effacé les en-têtes Json et utilisé' x-www-form-urlencoded' Pourriez-vous s'il vous plaît me dire ce que vous voulez dire par "Envoyer l'impression de Postman"? – Curiousity