Jestem całkiem nowy w usługach RESTful WCF, więc bądź ze mną. Próbuję zbudować prostą usługę WCF RESTful, która zwraca listę uczniów jako odpowiedź json. Wszystko działa dobrze do momentu, w którym próbuję przekonwertować ciąg json z powrotem na listę obiektów Studenta na kliencie.

Oto moja umowa operacyjna:

[OperationContract]
[WebGet(UriTemplate = "Students/", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
public List<Student> FetchStudents()
{
//Fetch and return students list
}

Kod klienta:

static void Main(string[] args)
{
HttpClient client = new HttpClient("http://localhost/StudentManagementService/StudentManagement.svc/");
response = client.Get("Students/");
response.EnsureStatusIsSuccessful();
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
string str = response.Content.ReadAsString();
List<Student> st = json_serializer.Deserialize<List<Student>>(str);
}

Ten kod oczywiście się nie powiedzie, ponieważ ciąg json zwrócony przez usługę wygląda jak poniżej:

{"FetchStudentsResult":[{"Course":"BE","Department":"IS","EmailID":"b@gmail.com","ID":1,"Name":"Vinod"}]}

Z jakiegoś powodu odpowiedź json jest pakowana w FetchStudentsResult. Teraz w trybie debugowania, jeśli na siłę usunę to opakowanie FetchStudentsResult, moja deserializacja działa idealnie.

Próbowałem DataContractJsonSerializer, ale wynik jest dokładnie taki sam. Czy ktoś może mi powiedzieć, czego mi brakuje?

11
Vinod 16 luty 2012, 18:11

2 odpowiedzi

Najlepsza odpowiedź

Ok, sam to rozgryzłem. Problemem jest poniższa linia:

BodyStyle = WebMessageBodyStyle.Wrapped

Kiedy zmieniłem to do:

BodyStyle = WebMessageBodyStyle.Bare

Wszystko działa idealnie!

Dzięki!

26
Steve B 26 lipiec 2013, 16:31

W moim przypadku był to WebInvoke zamiast WebGet i wysyłałem dane w treści. Z tego powodu to rozwiązanie nie działało dla mnie. Użyłem poniższego i zadziałało.

BodyStyle = WebMessageBodyStyle.RequestWrapped

Tak więc w poście ciało powinno być owinięte, ale nie ma potrzeby odpowiedzi. Dziękuję za pytającego i jego odpowiedź za udzielenie wskazówki dotyczącej tego problemu.

1
smoothumut 6 czerwiec 2019, 09:45