Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WCF. Enum не Object ? )) 
:(
    Опции темы
nikitao
Дата 29.11.2008, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: нет
Всего: 26



Всем привет. Проблема вот какого хор-ра. Вот есть у меня такой контракт :
Код

 public interface IService1
    {
      [OperationContract]
        object GetObject();
    }


Теперь имею вот такую реализацию у WCF web сервиса :
Код

public class Service1 : IService1
    {
 public object GetDay()
        {
            return DayOfWeek.Sunday;
        }
}


В итоге получаем Exception:
Базовое соединение закрыто: Соединение было неожиданно закрыто.

Как понимать и как бороться ? smile 



Это сообщение отредактировал(а) nikitao - 29.11.2008, 02:33


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
SpaceSpace
Дата 29.11.2008, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: 2
Всего: 10



Ты должен типизировать возваращаемый тип, а если тебе нужно возвращать разные типы - наследуй их от базового объекта и используй атрибут KnownType


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
nikitao
Дата 29.11.2008, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: нет
Всего: 26



У меня базовый обьект - это object и есть. А вот насчет KnownType  не понял. Насколько я понял его надо к контракту данных приписывать, но вот как мне это может помочь... можно пример ?


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
PashaPash
Дата 30.11.2008, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 6
Всего: 49



nikitao, в описание сервиса включаются только те типы, на которые он явно ссылается. В твоем случае - только object. Клиент ничего не знает о существовании DayOfWeek, и ес-но падает, получив объект DayOfWeek в респонзе. Чтобы не падал, его надо заранее предупредить о существовании типа DayOfWeek - поставить аттрибут KnownTypeAttribute/ServiceKnownTypeAttribute.


--------------------
PM MAIL WWW   Вверх
SpaceSpace
Дата 1.12.2008, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: 2
Всего: 10



PashaPash, да я об этом и говорю.

nikitao, а пример можешь и сам загуглить
вот выдранный из мсдн пример, найди понятнее сам

Код

// Apply the KnownTypeAttribute to the class that 
        // includes a member that returns a Hashtable.
        [KnownType(typeof(IDInformation))]
        [DataContract]
        public class Person : IExtensibleDataObject
        {
            private ExtensionDataObject ExtensionDataObjectValue;

            public ExtensionDataObject ExtensionData
            {
                get { return ExtensionDataObjectValue; }
                set { ExtensionDataObjectValue = value; }
            }

            private Hashtable MiscellaneousValue = new Hashtable();
            [DataMember]
            public Hashtable Miscellaneous
            {
                get { return MiscellaneousValue; }
                set { MiscellaneousValue = value; }
            }
        }

        [DataContract]
        public class IDInformation : IExtensibleDataObject
        {
            private ExtensionDataObject ExtensionDataValue;
            public ExtensionDataObject ExtensionData
            {
                get { return ExtensionDataValue; }
                set { ExtensionDataValue = value; }
            }

            [DataMember]
            public string ID;
        }




--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
PashaPash
Дата 1.12.2008, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 6
Всего: 49



SpaceSpace, да я  не спорю, просто надо было как-то упомянуть про ServiceKnownType.


--------------------
PM MAIL WWW   Вверх
nikitao
Дата 2.12.2008, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: нет
Всего: 26



SpaceSpace,  пример с msdn я и сам скопи пастить могу.

У меня ж проблема не в DayOfWeek , я его для примера привел. У меня есть словарь настроек ключ ( строка) значение( значение). Как я его могу передать ? 
Я вышел из этого написав оболочку , которая передает словарь в бинарно-сериализированом виде ( еще и шифрование добавил, но эт не важно). В таком случае понятное дело проблем нет. 


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
SpaceSpace
Дата 2.12.2008, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: 2
Всего: 10



Код

[ServiceContract(Namespace = "http://XXX")]
public interface IService
{
         [OperationContract]
         Dictionary<string, BaseDataObject> GetData()
 }

[DataContract]
[KnownType(typeof(MyObject1))]
[KnownType(typeof(MyObject2))]
public class BaseDataObject
{}

[DataContract]
public class MyObject1 : BaseDataObject
{
        [DataMember]
        public float Value { get; set; }
}

Пробуй

Это сообщение отредактировал(а) SpaceSpace - 2.12.2008, 08:50


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
SpaceSpace
Дата 3.12.2008, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: 2
Всего: 10



nikitao, получилось у тебя что-нить или нет?


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
nikitao
Дата 3.12.2008, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: нет
Всего: 26



SpaceSpace,  спасибо и ссори , что не отвечаю так долго. smile  Наверно я туплю , но я не понимаю , как мне может этот аттрибут помочь smile  Просто сходя из 
Цитата(nikitao @  2.12.2008,  02:38 Найти цитируемый пост)
У меня есть словарь настроек ключ ( строка) значение( значение)

следует, что мне надо передавать Dictonary<sting,object> , а типы , которые хранятся в object на этапе написания сервиса еще не известны. ( и бог знает что там будут за типы , со временем). А с KnowType как я понял нам нужно , чтобы все типы были известны заранее smile 



--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
SpaceSpace
Дата 4.12.2008, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: 2
Всего: 10



на сколько мне известно, в WCF ты должен знать тип передаваемого объекта.
и без перечисление KnownType _ не обойтись, WCF должен знать о типе который нужно сериализовать\десериализовать,
и тип соответсвенно д.б. Serializable или DataContract

если найдешь способ обойти это - делись. я все что знал- рассказал


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
nikitao
Дата 4.12.2008, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: нет
Всего: 26



ну я сейчас делаю так: сериализую\десириализую на стороне клиента\сервера своим кодом , а передаю byte[].


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
PashaPash
Дата 4.12.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 6
Всего: 49



nikitao, так для введения новых типов на стороне сервера тебе сейчас все равно надо обновить и сервер и клиент. Что мешает при этом обновлять сервис и дописывать Known Types для текущей версии?


--------------------
PM MAIL WWW   Вверх
nikitao
Дата 4.12.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: нет
Всего: 26



Цитата(PashaPash @  4.12.2008,  14:56 Найти цитируемый пост)
nikitao, так для введения новых типов на стороне сервера тебе сейчас все равно надо обновить и сервер и клиент. Что мешает при этом обновлять сервис и дописывать Known Types для текущей версии? 


Сервер в большой степени используется как хранилище. Для этого Dictonary он вообще используется только как хранилище. Мне все равно все эти обьекты приходится сохранять в БД как varbinary. 

А вообще это не очень хорошо в любом случае дописывать помоему...


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
PashaPash
Дата 4.12.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 6
Всего: 49



nikitao, не хорошо отдавать с сервера нетипизированные данные. Можно дописывать в конфиге сервиса:
<system.runtime.serialization>
  <dataContractSerializer> of <system.runtime.serialization>
    <declaredTypes>
      <add> of <declaredTypes> Element
или прописать в ServiceKnownTypes параметр Method и строить список известных типов динамически при активации сервиса.
А вообще - не сохраняй как varbinary, это тянет за собой очень много проблем, в первую очередь с версионностью.


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0710 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.