12

Sto provando a inviare i dati JSON a un metodo Api Web ma i dati JSON non sono vincolanti per il modello.ASP.Net Web Api modello non impegnativo su POST

Ecco il mio modello:

[DataContract] 
public class RegisterDataModel 
{ 
    [DataMember(IsRequired = true)] 
    public String SiteKey { get; set; } 

    [DataMember(IsRequired = true)] 
    public String UserId { get; set; } 

    [DataMember(IsRequired = true)] 
    public String UserName { get; set; } 
} 

Ecco il mio Web azione Api:

public class RegisterController : ApiController 
    { 
    public Guid Post([ModelBinder] RegisterDataModel registerDataModel) 
    { 
     if (!ModelState.IsValid) 
     { 
      throw new ModelStateApiException(ModelState); 
     } 
     var userProfileDataContract = userProfileBusinessLibrary.GetNewOne(); 
     userProfileDataContract.UserId = registerDataModel.UserId; 
     userProfileDataContract.UserName = registerDataModel.UserName; 

     var userKey = userProfileBusinessLibrary.Register(registerDataModel.SiteKey, userProfileDataContract); 

     return userKey; 
    } 
    } 

Prima ho aggiunto [ModelBinder], registerDataModel era nullo. Dopo aver aggiunto [ModelBinder], registerDataModel è un'istanza RegisterDataModel, ma tutti i valori delle proprietà sono nulli.

Ecco la mia richiesta via Fiddler:

http://local.testwebsite.com/api/register 

Request Headers: 
User-Agent: Fiddler 
Host: local.testwebsite.com 
Content-Length: 89 
Content-Type: application/json; charset=utf-8: 

Request Body: 
{ 
"SiteKey":"qwerty", 
"UserId": "12345qwerty", 
"UserName":"john q" 
}  

Che cosa mi manca per fare il mio post si legano i dati alle proprietà RegisterDataModel? Grazie per l'aiuto.

+0

Potrebbe essere necessario l'attributo '[Post]' sull'azione del controller. – McGarnagle

+1

Grazie per la risposta, ma l'aggiunta di [HttpPost] non è stata d'aiuto. Mi sembra che con WebApi non siano necessari gli attributi verb del http perché ASP.net MVC utilizza una convenzione per associare il verbo all'azione del controller. –

risposta

10

Come si sta creando la richiesta JSON? Attraverso il costruttore di richieste di Fiddler? Prova solo quanto segue nel corpo della richiesta.

{ 
"SiteKey":"qwerty", 
"UserId": "12345qwerty", 
"UserName":"john q" 
} 

Sto supponendo 'Richiesta corpo:' fa anche parte del corpo della richiesta. Rimuovilo e controlla.

+0

Sto usando il compositore di Fiddler per inviare i dati json alla mia web API. Ecco una schermata: http://screencast.com/t/x2IH6hp01rGQ –

+0

Se rimuovo il [ModelBinder], funziona perfettamente per me. Ho appena copiato il codice e l'ho testato. Una differenza che sto vedendo qui è che il tuo contenuto-Lunghezza è 89. Il mio è 64 per lo stesso payload. Ecco perché suppongo che tu stia inviando qualcosa in più come "Richiesta corpo:" – Badri

+4

Oh, btw, c'è un colon extra o un punto e virgola vicino a utf-8 Content-Type: application/json; charset = utf-8: Rimuovere e provare per favore – Badri

11

non legati al problema del PO, ma il titolo della questione mi ha portato qui quando ho usato (pubblici) campi invece di proprietà nella classe del modello (vale a dire senza {get; set;}). Si è scoperto che questo causa anche il bind di fallire.

Forse aiuta qualcuno.

+1

Ho avuto esattamente lo stesso problema e l'aggiunta di un get e set risolto questo. –

+1

Anche questo mi ha aiutato. Sono contento di vedere che non è stato cancellato, sicuramente appartiene a questo titolo di domanda anche se OP aveva già delle proprietà. –

+0

Questo mi ha aiutato. Molte grazie! – pwaivers

0

Nel mio caso, le richieste dell'app vengono passate attraverso un middleware chiamato "API Manager" per l'autenticazione/autorizzazione prima di inoltrare alla mia API Web .NET. Il parametro POST non è vincolato perché, per qualche ragione, non ho idea del perché, il "Content-Length" viene emesso dalle intestazioni. Il motivo è perché, il JsonMediaTypeFormatter predefinito controlla sempre le richieste "Content-Length" prima di eseguire il binding del modello, e se Content-Length non è presentato, imposterà il parametro su NULL.