2013-10-03 10 views
5

Использую Wcf Service и JS.Отправка списка в пределах объекта в службу Wcf

Я посылаю информацию к моей службе AJAX.

У меня есть функция в службе, которая принимает следующий объект:

[DataContract] 
    public class Business 
    { 
     [DataMember] 
     public string Name { get; set; } 
     [DataMember] 
     public string Desc { get; set; }   
     [DataMember] 
     public List<BusinessService> Services { get; set; } 
    } 

в BusinessService.cs:

[DataContract] 
    public class BusinessService 
    { 
     [DataMember] 
     public string Name { get; set; } 
     [DataMember] 
     public string Desc { get; set; } 
     [DataMember] 
     public int LongTime { get; set; } 
    } 

Я синтаксический анализ объектов в моих JS для JSON и отправить их на оказание услуг.

Здесь JSON, переводящих функции ФОС:

"{"ManageBusiness":{"Name":"aaaaaa","Desc":"aaaaaaaaaaaa","Services":[{"Name":"aaaaaa","Desc":"aaaaaa","LongTime":30},{"Name":"aaaaaa1","Desc":"aaaaaa","LongTime":30}]}}" 

Все работает, как должно, за исключением Services списка.

Список приходит к функции wcf как null.

Я понятия не имею, почему это происходит, я был бы признателен за помощь?

ответ

4

Вы не можете создать экземпляр List<T> из данных JSON. Что вы можете сделать, это заменить:

[DataContract] 
    public class Business 
    { 
     [DataMember] 
     public string Name { get; set; } 
     [DataMember] 
     public string Desc { get; set; }   
     [DataMember] 
     public List<BusinessService> Services { get; set; } 
    } 

с

[DataContract] 
    public class Business 
    { 
     [DataMember] 
     public string Name { get; set; } 
     [DataMember] 
     public string Desc { get; set; }   
     [DataMember] 
     public BusinessService[] Services { get; set; } 
    } 

То есть, заменить List<T> с Array of T

+0

Это также не помогло. Список продолжает получать нуль. –

+0

Ну, ваше представление JSON хорошо сформировано, поэтому я не могу понять, что может быть неправильно, можете ли вы отправить еще какой-нибудь код? Например, код C#, который обрабатывает вызов и код javascript, который отправляет запрос? –

+0

Действительно ли это работает? Я тоже переживаю такой же сценарий! Мне нужен этот код. –

0

Вы можете использовать WCF Service Trace Viewer, чтобы помочь вам просматривать и отслеживать ошибки, которые вы получаете от оказание услуг.

0

попробовать это,

var data = "{"ManageBusiness":{"Name":"aaaaaa","Desc":"aaaaaaaaaaaa","Services":[{"Name":"aaaaaa","Desc":"aaaaaa","LongTime":30},{"Name":"aaaaaa1","Desc":"aaaaaa","LongTime":30}]}}"; 

Добавить ниже в Ajax вызова

contentType: "application/json", 
data: JSON.stringify({ business: data }), 

ниже код, чтобы получить данные

public ActionResult BusinessCall(Business business){} 
0

Ниже я могу сказать определенно работает. Я просто протестировал его. Извините его в vb.net, но вы должны получить эту идею.

На стороне сервера: В IService1.vb

Imports System.ServiceModel 
Imports System.ServiceModel.Activation 
Imports System.ServiceModel.Web 

Namespace Webservices 
    <ServiceContract()> 
    Public Interface IService1 

    <OperationContract()> _ 
    <WebInvoke(method:="POST", ResponseFormat:=WebMessageFormat.Json, BodyStyle:=WebMessageBodyStyle.WrappedRequest)> _ 
    Function test(manageBusiness As ManagedBusiness) As string 

    End Interface 
End Namespace 

В Service1.svc.vb

Imports System.Runtime.Serialization 
Imports System.ServiceModel.Activation 
Namespace Webservices 
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Required)> 
Public Class Service1 
    Implements IService1 
    Public function test(manageBusiness As ManagedBusiness) As string Implements IService1.test 
     Return "done" 
    End function  
End Class 

<CollectionDataContract()> 
Public Class Services 
    Inherits List(Of Service) 
End Class 

<DataContract()> 
Public Class Service 
    <DataMember()>Public Property Name As String 
    <DataMember()>Public Property Desc As String 
    <DataMember()>Public Property LongTime As Integer 
End Class 

<DataContract()> 
Public Class ManagedBusiness 
    <DataMember()>Public Property Name As String 
    <DataMember()>Public Property Desc As String 
    <DataMember()>Public Property Services As Services 

End Class 
End NameSpace 

Я телеграфировал до настройки WebConfig.И поставить этот Jquery Ajax вызова на стороне клиента:

$("#btnTest").click(function() { 
      var services = []; 
      services.push({ 
       Name: "aaaaaa", 
       Desc: "aaaaaa", 
       LongTime: 30 
      }); 
      services.push({ 
       Name: "aaaaaa1", 
       Desc: "aaaaaa", 
       LongTime: 30 
      }); 
      var data = {}; 
      data.manageBusiness = { 
       Name: "aaaaaa", 
       Desc: "aaaaaaaaaaaa", 
       Services: services 
      } 


      $.ajax({ 
       type: "POST", 
       url: "http://localhost:64110/Webservices/Service1.svc/test", 
       dataType: "json", 
       contentType: "application/json; charset=utf-8", 
       async: true, 
       data: JSON.stringify(data), 
       success(msg) { 

       } 
      }); 


     }); 

Я могу подтвердить, что запрашиваемая Payload следующим образом:

{"manageBusiness":{"Name":"aaaaaa","Desc":"aaaaaaaaaaaa","Services":[{"Name":"aaaaaa","Desc":"aaaaaa","LongTime":30},{"Name":"aaaaaa1","Desc":"aaaaaa","LongTime":30}]}} 

И служба WCF десериализации все просто отлично. Я думаю, что вам не хватало атрибута [CollectionDataContract].

UPDATE: Я попытался удалить атрибут [CollectionDataContract], и он работал STILL. Поэтому я предполагаю, что атрибуты контрактных данных предназначены только для сериализации, не требуются для десериализации (?)

Смежные вопросы