2012-05-08 37 views
5

Jestem nowym użytkownikiem Web API piszącym usługę RESTFul Web Api w .Net 4. Skonfigurowałem kontroler dla klasy, którą wywołuję Authentication. Problem polega na tym, że kiedy wysyłam lub umieszczam dane JSON do usługi web api, moje programy obsługi w kontrolerze są wywoływane, ale obiekty parametrów zawierają w nich dane NULL. Mogę pomyślnie pobrać dane, ale Post i Put wymyślają puste obiekty parametrów..NET 4 Web API odbiera dane NULL w parametrach

Testowałem z aplikacji klienckiej i Fiddlera, a otrzymałem taki sam wynik. Oto co ja przesyłam z Skrzypek:

Action: PUT 
URI: http://127.0.0.1:81/Authentication/xyz/ 
HTTP Version: HTTP/1.1 
Request Headers: 
User-Agent: Fiddler 
Host: 127.0.0.1:81 
Content-Type: application/json; charset=utf-8 
Content-Length: 75 
Request Body: 
{"hashvalue":"kbVFNeBbNHmYQXXlS6d7Ag==","password":"test","username":"dan"} 

Kiedy ustawić punkt przerwania w procedurze obsługi umieścić w kontrolerze Authentication:

public void Put(string IDstring, Authentication value) 
    { 

    } 

otrzymuję następujący w oknie Watch:

IDstring     null string 
value {bbsRESTResources.Authentication} bbsRESTResources.Authentication 
    hashvalue null string 
    password null string 
    username null string 

Moja klasa uwierzytelniania wygląda następująco:

namespace bbsRESTResources 
{ 
    public class Authentication 
    { 
     public string username; 
     public string password; 
     public string hashvalue; 
    } 
} 

moja Droga wygląda następująco:

 routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

Proszę nie martwić się o to, czy nie jest to dobry sposób, aby obsługiwać uwierzytelnianie. To tylko pierwszy krok w testowaniu mojej aplikacji od końca do końca. Szukałem przykładów innych osób mających ten problem i nie znalazłem żadnego.

Odpowiedz

0

i zdefiniować Sposób

public void Put(Authentication value) 
{ 

} 
+0

Oczyściłem swoją trasę, aby wysłać {username} i zmieniono deklarację metody na: public void Put (nazwa użytkownika łańcucha, wartość uwierzytelniania). Teraz otrzymuję nazwę użytkownika poprawnie, ale wartość jest nadal obiektem uwierzytelniania z wszystkimi wartościami pustymi dla członków. Procedura obsługi Post jest kodowana tak, jak ją wysłałeś (ale nazywa się Post), a także zwraca wartości null dla członków obiektu Uwierzytelniania. – Dan

6

Okazuje się, że spoiwo wzór działa tylko na właściwości, a nie polami. W rezultacie musiałem utworzyć właściwości z poszczególnych elementów klasy Authentication. Kiedy zmieniłem definicję klasy Authentication do następujących, to działa:

public class Authentication 
{ 
    public string hashvalue {get; set;} 
    public string password { get; set; } 
    public string username { get; set; } 
} 
+3

Ponadto, tak jak z uwagą na temat tego, co miałem do czynienia z innym problemem, który może powodować ten sam problem. Upewnij się, że wiersz typu treści to "Content-Type: application/json; charset = utf-8" –

2

miałem podobny problem (obiekty parametrów były null), inną przyczynę. Oznacziłem mój model jako Serializable iz jakiegoś powodu bindowanie modelu nie zadziałało, gdy to zrobiłem. Po usunięciu atrybutu powiązanie działało ponownie.

+0

To jest bardzo dziwne, mam problem podobny do tego opisanego w pytaniu i usunięto atrybut Serializable! Dzięki! –

Powiązane problemy