Контракт данных для класса с полями, являющимися собственно пользовательскими классами

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

public class Service: IService<br>
{
    public ClassWS My_Stores(String URL)
    {
        try
        {
            //ClassWS is a class which has other classes like address() defined by me 
            ClassWS My_WS = new ClassWS ();
            return ClsStore.My_Stores(URL);
        }
        catch (Exception ex)
        {}
    }
}

[DataContract]
public class ClassWS 
{
    [DataMember]
    public granularity Granularity;
    [DataMember]
    public address[] Address = new address[5];
    [DataMember]
    public Store[] Stores;
    [DataMember]
    public int Status;

    public ClassWS My_Stores(String URL)
    {
        ClassQuery q = new ClassQuery();
        return (sq.PopulateStores(URL));
    }
}

Я включил каждый определенный мною класс в DataContract, как и в предыдущем классе. Я получаю указанную ниже ошибку, когда пытаюсь вернуть ClassWS, но не имею ошибки с возвратом Store [] или Address []

Я получаю сообщение об ошибке. Ошибка не возвращается в служебном коде, но возникает при перенастройке значения на прокси.

Базовое соединение было закрыто: соединение было неожиданно закрыто. Трассировка стека сервера:
в System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException (WebException webException, запрос HttpWebRequest, HttpAbortReason abortReason) в System.ServiceModel.Channels.HttpChannelFactory. Channels.RequestChannel.Request (сообщение сообщения, тайм-аут TimeSpan) в System.ServiceModel.Dispatcher.RequestChannelBinder.Request (сообщение сообщения, тайм-аут TimeSpan) в System.ServiceModel.Channels.ServiceChannel.Call (действие String, операция Boolean oneway, ProxyOneway [] ins, Object [] out, тайм-аут TimeSpan) в System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (IMethodCallMessage methodCall, операция ProxyOperationRuntime) в System.ServiceModel.Channels.ServiceChannelProxy.Invokeception (сообщение IMethodChannelProxy.Invokeception) [0]
в System.Runtime.Remoting.Proxies.RealPr oxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg) в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData & msgData, тип Int32) в IFindStore.My_Stores (URL-адрес строки) в FindStoreStoreClientception (URL-адрес String) в FindStoreClientception.My соединение было закрыто: соединение было неожиданно закрыто. в System.Net.HttpWebRequest.GetResponse () в System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply (тайм-аут TimeSpan)

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

Должен ли я записывать объект в поток с помощью datacontractserialzer (даже если в контракте данных используется datacontractserializer). Должен ли я использовать XmlSerializer?

заранее спасибо


person vasanth    schedule 04.10.2010    source источник


Ответы (1)


В общем, пока у вас есть DataContract + Datamembers для всех соответствующих классов, которые, похоже, у вас уже есть, это все, что требуется DataContractSerializer для их сериализации.

Следующее

The underlying connection was closed: The connection was closed unexpectedly. 
Server stack trace: at System.ServiceModel.Channels.HttpChannelUtilities.
ProcessGetResponseWebException (WebException .....

- это общее исключение, которое вы обычно видите, если в вашей службе есть необработанное исключение, вызывающее закрытие удаленного соединения.

Это не обязательно связано с сериализацией ваших классов.

Я бы посоветовал вам войти в свой метод обслуживания во время отладки, так как он точно скажет вам, какое исключение выбрасывается и почему!

person Jagmag    schedule 04.10.2010
comment
Сервис не вызывал ошибок, он вернул правильный ответ. ошибка возникает после последнего} метода. Я думаю, что у него есть какое-то нарушение контракта, когда он привязывает возвращаемое значение к прокси. Ошибка возникает, даже если я возвращаю только новый ClassWS, общедоступный ClassWS My_Stores (String URL) {try {return new ClassWS (); } catch (Exception ex) {}} - person vasanth; 04.10.2010
comment
@vasanth - Предполагая, что ваша служба работала раньше, возможно ли, что ваш контракт на обслуживание недавно изменился, но прокси-сервер клиента не обновлен? Может быть, вы можете попробовать обновить ссылку на службу, выполнив ссылку на службу обновления, чтобы быть уверенным? Такая ошибка очень возможна в таком сценарии? Это тоже должно быть возможно отладить, войдя в класс прокси? - person Jagmag; 04.10.2010
comment
@InSane Ошибка преобладала, даже когда я обновляю ссылку на службу и пробовал тестовый клиент WCF в VS2010. Та же ошибка возникает, когда я пытаюсь вызвать службу в тестовом клиенте WCF. - person vasanth; 04.10.2010
comment
@vasanth - Вы пробовали войти в прокси-класс во время отладки? Есть какие-нибудь подсказки? Кроме этого ... у меня все закончились идеи !! Кстати, у меня иногда были проблемы с обновлением Service Reference - просто откройте клиентский прокси-класс и в любом случае убедитесь, что он синхронизируется с вашими фактическими классами DataMember. - person Jagmag; 04.10.2010
comment
@InSane: детализация поля - это перечисление, когда я изменил его атрибут на EnumMember, все работало нормально. Я думал, что атрибут EnumMember следует использовать только при определении и должен использоваться как DataMember, когда он используется как поле. Но я был неправ. Спасибо за помощь InSane - person vasanth; 04.10.2010
comment
@vasanth - мне тоже это кажется странным !! Мое понимание EnumMember такое же, как и ваше. Я даже проверил документацию msdn.microsoft.com/en-us/library/aa347875 .aspx, и даже это, похоже, согласуется с этим пониманием !! Немного странно ... !! - person Jagmag; 04.10.2010
comment
@InSane: я использую перечисления в классах, которые я использовал в качестве полей, там я использовал атрибут DataMember для контракта. Кажется, что эти перечисления работают нормально, но не в возвращаемом классе. Может быть, их атрибут контракта зависит от того, имеется ли прямая ссылка на перечисление или используется ли он в другом классе, который используется как поле - person vasanth; 04.10.2010