Соединение WCF закрыто со сложными данными

У меня есть служба WCF, и в этой службе я возвращаю класс с множеством свойств, некоторые из которых сами являются классами, и это немного сложно, но не очень. Я сделал нечто подобное в том же проекте с другой службой WCF, и все сработало нормально. Но этот выдал мне эту ошибку, когда я его использовал.

[System.ServiceModel.CommunicationException]    {"An error occurred while receiving the HTTP response to http://xxx/Service.svc. This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details."}  System.ServiceModel.CommunicationException

Внутреннее исключение

[System.Net.WebException]   {"The underlying connection was closed: An unexpected error occurred on a receive."}    System.Net.WebException

Внутреннее исключение этого говорит

[System.IO.IOException] {"Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host."}   System.IO.IOException

Внутреннее исключение этого говорит

[System.Net.Sockets.SocketException]    {"An existing connection was forcibly closed by the remote host"}   System.Net.Sockets.SocketException

Итак, вот что я пробовал. Я думал, что, возможно, есть какая-то ошибка в моем файле .svc или, возможно, есть какая-то ошибка в моей конфигурации файлов .config, но, насколько я вижу, это не так. Затем я подумал, что должен попробовать и посмотреть, смогу ли я отправить простой тип с сервера клиенту. Поэтому я создал метод с именем GetInt(), который возвращает 7. Я вызвал его на клиенте, и он работал нормально. Поэтому я думаю, что данные, которые я отправляю обратно с сервера, не поддерживаются. Я не понимаю, почему, потому что, как я уже сказал, я уже отправлял сложные типы в том же проекте (буквально вчера), и все это работало. Во всяком случае, вот мой класс, который я отправляю. Возможно, кто-то может указать, что может не поддерживаться. Или, возможно, кто-то знает, что еще могло быть причиной этого.

    public class Hotels
    {
        public string Language { get; set; }
        public string Datum { get; set; }
        public  List<HotelListing> HotelListing { get; set; }
    }

    public class HotelListing
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public string Country { get; set; }
        public decimal Latitude { get; set; }
        public decimal Longitude { get; set; }
        public string Category { get; set; }
        public List<PhoneNumber> PhoneNumbers { get; set; }
        public Address Address { get; set; }
        public Content Content { get; set; }
    }

    public class Content
    {
        public Description Description { get; set; }
        public List<Review> Reviews { get; set; }
        public Image Image { get; set; }
        public AtrttributeData AtrttributeData { get; set; }
    }

    public class AtrttributeData
    {
        public string Link { get; set; }
        public string Title { get; set; }
        public NameValueCollection Attributes { get; set; }
    }

    public class Image
    {
        public string Type { get; set; }
        public string ImageURL { get; set; }
        public string HotelURL { get; set; }
    }

    public class Review
    {
        public string Type { get; set; }
        public string Link { get; set; }
        public string Author { get; set; }
        public string Body { get; set; }
        public NameValueCollection Ratings { get; set; } 
    }

    public class Description
    {
        public string Link { get; set; }
        public string Title { get; set; }
        public string Body { get; set; }
    }

    public class Address
    {
        public string Format { get; set; }
        public string Addr1 { get; set; }
        public string Addr2 { get; set; }
        public string City { get; set; }
        public string PostCode { get; set; }
    }

    public class PhoneNumber
    {
        public string Type { get; set; }
        public string Number { get; set; }
    }

Рассматриваемый метод заключается в следующем

[OperationContract]
Hotels GetHotels();

Любая помощь будет принята с благодарностью.

Вот мой раздел конфигурации

<binding name="BasicHttpBinding_ITablet" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>

<snip>

<endpoint address="http://xxx/Service.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ITablet"
                contract="SupplierInterfaceTabletService.ITablet" name="BasicHttpBinding_ITablet" />

Благодарность,

Сачин


person Sachin Kainth    schedule 08.08.2012    source источник
comment
Пожалуйста, добавьте раздел system.serviceModel из файла конфигурации вашего приложения. Возможно, у вас не установлен максимальный размер сообщения или другой параметр конфигурации, связанный с размером сообщения.   -  person user957902    schedule 08.08.2012
comment
Я бы включил отслеживание и посмотрел, сможете ли вы получить больше диагностической информации. Настройка трассировки описана здесь.   -  person user957902    schedule 08.08.2012
comment
На стороне сервера или на стороне клиента?   -  person Sachin Kainth    schedule 08.08.2012


Ответы (2)


Попробуйте вернуть DataContract (не класс). Это DataContract со списком другого DataContract и примером наследования.

[DataContract]
public class sDoc
{
    [DataMember]
    public int sID;
    [DataMember]
    public int sParID;
    [DataMember]
    public List<sDocProp> Props;
    [DataMember]
    public string SessionID;

    public string NotDataMember;
}

[DataContract]
[KnownType(typeof(sDocPropStringSV))]
public class sDocProp
{
    [DataMember]
    public int ID;
    [DataMember]
    public string Name;
    [DataMember]
    public ArrivalStatus ArrivalStatus;
}

[DataContract]
public class sDocPropStringSV : sDocProp
{
    [DataMember]
    public string Value;
}
person paparazzo    schedule 08.08.2012
comment
Это неверно: атрибуты DataContract и DataMember необязательны. Если нет, все общедоступные свойства класса будут сериализованы. - person CodeCaster; 08.08.2012
comment
Да, я вчера не делал этого с другим моим примером, и все работало нормально. У меня есть такая вещь на моей стороне клиента. - person Sachin Kainth; 08.08.2012
comment
@CodeCaster Хорошо, я изменил его, чтобы попробовать. - person paparazzo; 08.08.2012
comment
Вопрос не указывает на использование DataContracts. Я бы разобрал его и вернул что-то очень простое и построил оттуда. - person paparazzo; 08.08.2012

Я люблю .NET, иногда это такой мусор. Проблема заключалась в NameValueCollections. По какой-то причине у WCF возникла проблема с передачей их с сервера клиенту. Иди разберись!

person Sachin Kainth    schedule 08.08.2012
comment
Это не WCF — это NameValueCollection. Это не сериализуется из коробки. Ознакомьтесь с этим ответом: XML-сериализация коллекции в C#. - person Tim; 08.08.2012