2014-10-22 4 views
1

Я пытаюсь построить Restful WCF Service, который возвращает данные в JSON формат. Мои первые методы работают нормально, но когда я пытаюсь вернуть коллекцию, моя тестовая программа получает следующее исключение:wcf rest json return collection

Невозможно записать данные в транспортное сообщение. Существующее соединение было принудительно закрыто удаленным хостом.

Мой код Услуги:

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/GetModes")] 
    OGetModesResponse OGetModes(OGetModesRequest oGetModes); 
} 
[DataContract] 
public class OGetModesRequest 
{ 
    private String m_sTicket; 

    [DataMember] 
    public String prTicket 
    { 
     get { return m_sTicket; } 
     set { m_sTicket = value; } 
    } 
} 

[DataContract] 
public class OGetModesResponse 
{ 
    [DataMember] 
    public string sTicket; 
    [DataMember] 
    public emStatus emStatus; 
    [DataMember] 
    public IList<CTMode> aoModes; 
} 

И моя тестовая программа:

OGetModesRequest oGetModes = new OGetModesRequest { prTicket = sTicket }; 
ser = new DataContractJsonSerializer(typeof(OGetModesRequest)); 
mem = new MemoryStream(); 
ser.WriteObject(mem, oGetModes); 
webClient = new WebClient(); 
webClient.Headers["Content-type"] = "application/json"; 
webClient.Encoding = Encoding.UTF8; 
//Exception here 
bData = webClient.UploadData("http://localhost:26104/Service.svc/GetModes", "POST", mem.ToArray()); 
stream = new MemoryStream(bData); 
obj = new DataContractJsonSerializer(typeof(OGetModesResponse)); 
OGetModesResponse OResultModes = obj.ReadObject(stream) as OGetModesResponse; 

отладить свои услуги и работает отлично. Что может случиться?

Спасибо за помощь.

Edit (решение): CTMode класс используется управляющим объектом, который я получаю, используя NHibernate поэтому я создаю новый класс сериализуемый под названием CMode

[DataContract] 
public class OGetModesResponse 
{ 
    [DataMember] 
    public string sTicket; 
    [DataMember] 
    public emStatus emStatus; 
    [DataMember] 
    public IList<CMode> aoModes; 
} 
[Serializable] 
public class CMode 
{ 
    public Int32 nId; 
    public Int32 nCode; 
    public String sName; 
} 
+0

Взгляните на это http://www.codeproject.com/Answers/687613/unable-to-read-data-from-the-transport-connection#answer2 –

ответ

0

Попытка проверить внутреннее исключение и добавить протоколирование/след на сервере.

Есть несколько возможностей для вашей (родовой) ошибки, как вы можете не знать о внутреннем исключении:

  • объект CTMode отсутствует DataContract, DataMember атрибут.
  • объект CTMode является перечислением, что отсутствующие атрибуты или имеют неправильное значение, которое не может быть сериализовано
  • предыдущего соединения не закрывается правильно
  • есть прокси-сервер на пути, и вам необходимо, чтобы обойти его
+0

Ошибка появляется только тогда, когда IList ! = Null. Если метод возвращает IList == null, все работает нормально. Отсутствует прокси-сервер и соединение закрыто правильно. Я думаю, что проблема в сериализации CTMode. Класс CTMode используется для работы с объектом NHibernate, я добавляю этот класс в DataContract, как вы говорите. Извиняюсь за формат записи, но я записываю noob в stackoverflow, и я до сих пор не правильно писал на этой странице. – Chema

+0

Я добавляю новый класс в DataContract, и теперь он работает. Я отредактировал свой ответ, чтобы добавить модификацию. Спасибо Wojciech. – Chema

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