2017-02-21 2 views
0
  • RestSharp 105.2.3
  • WebAPI 2

So habe ich eine einfache WebAPI Controller als solche:RestSharp mein WebAPI Parameter Aufruf leer

public class EnettController : ApiController 
{ 
    private readonly DebitService _EnettService; 

    public EnettController() 
    { 
     _EnettService = new DebitService(); 
    } 

    [HttpPost] 
    public ProcessDirectDebitResponse ProcessDirectDebit([FromBody] ProcessDirectDebitRequest aRequest) 
    { 
    } 
} 

und von meinem Test-Harnisch I rufen Sie es mit dem folgenden RestSharp-Code auf:

RestClient client = new RestClient($"http://{txtHost.Text}:{txtPort.Text}"); 

ProcessDirectDebitRequest dataForRequest = new ProcessDirectDebitRequest 
              { 
               AgentId = "James Bond", 
               DepartureDate = DateTime.Now, 
               Version = "123" 
              }; 

RestRequest request = new RestRequest("api/Enett", Method.POST) 
         { 
          RequestFormat = DataFormat.Json 
         }; 
request.AddHeader("Accept", "application/json"); 
request.AddHeader("Content-Type", "application/json; charset=utf-8"); 
request.AddBody(dataForRequest); 

IRestResponse<ProcessDirectDebitResponse> response = client.Execute<ProcessDirectDebitResponse>(request); 

if (response.StatusCode != HttpStatusCode.OK) 
{ 
    MessageBox.Show($"Did not yet a 200 response. Got instead {response.StatusCode}"); 
} 

Mein WebAPI-Endpunkt ist kein Problem, aber aRequest ist immer NULL. So vermisse ich hier etwas Offensichtliches, ich kann einfach nicht sehen, was es ist. Warum ist eine Anfrage immer NULL?

+0

scheint auf den ersten Blick in Ordnung zu sein. Kann die Anfrage-Payload mit Fiddler oder ähnlichen Tools überprüft werden? Möglicherweise können Sie auch versuchen, 'request.AddJsonBody (dataForRequest);' – Developer

+0

AddJsonBody() macht keinen Unterschied. Ich versuche immer noch, Fiddler dazu zu bringen, die Anfrage zu sehen. – TheEdge

+0

Das stimmt, sollte keinen Unterschied machen; möchte nur sicherstellen, dass beim Festlegen von Content-Type kein Tippfehler aufgetreten ist. Sollte einige Informationen erhalten, wenn Sie in die Nutzdaten und Header der Anfrage schauen. – Developer

Antwort

0

Das Problem hier stellte sich heraus, dass die ProcessDirectDebitRequest Klasse als [Serializable] eingerichtet worden war, in der folgenden Nutzlast resultierende erwartet wird:

{ 
    "<AgentId>k__BackingField": "sample string 1", 
    "<DepartureDate>k__BackingField": "2017-02-22T12:01:25.8332359+11:00", 
    "<Version>k__BackingField": "sample string 3" 
} 

statt dessen, was, was erwartet wurde, das war:

{ 
    "AgentId": "sample string 1", 
    "DepartureDate": "2017-02-22T12:01:25.8332359+11:00", 
    "Version": "sample string 3" 
} 

Es gibt ein paar Möglichkeiten, um diese je nach Ihren Bedürfnissen:

  1. Nicht dekorieren mit [Serialize]
  2. Verwenden Sie config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings(); Entfernen // Unterstützung Felder und halten [Serialisieren]
  3. Ausdrücklich verwenden [Datacontract], [Datamember]