HashSet в WCF
-
20-08-2019 - |
Вопрос
я использую HashSet в своем интерфейсе WCF
[ServiceContract]
public interface IwcfServerSync
{
[OperationContract]
void Test(HashSet<int> someHashSet);
}
Когда я создаю ссылку на службу, HashSet превращается в int[].
Я добавил ServiceKnownType:
[ServiceKnownType(typeof(System.Collections.Generic.HashSet<int>))]
и попробовал некоторую конфигурацию, но не смог ее изменить.
если я изменю его жестко запрограммировано, все будет работать, но менять его каждый раз при обновлении ссылки очень раздражает.
возможно, я делаю что-то не так, есть какие-нибудь подсказки или идеи?
Решение
Сборы упрощаются, когда они передаются по сети.Вы можете указать тип коллекции через IDE и командную строку (svcutil /collectionType
), но это будет относиться к все коллекции по API.Я думаю, вам следует просто принять это и устранить несоответствие с помощью кода.В конечном счете, в сети коллекции представляют собой просто xml (по крайней мере, поверх стандартных привязок) - что-то вроде:
<items>
<item ...>...</item>
<item ...>...</item>
<item ...>...</item>
</items>
- следовательно, почему он не может отличить (из схемы) массив (T[]
), а List<T>
, а HashSet<T>
, и MyFunkyCollection<T>
.
Обратите внимание: если вы используете общий доступ к сборке (т.та же сборка сервисного контракта есть у клиента и server), то этого не произойдет, но это противоречит целям SOA/mex.Но этот подход используется довольно часто - следовательно, IDE поддерживает его напрямую и из командной строки через переключатель (svcutil /reference
).
Для IDE, поддерживающей это...если вы напишете контракт службы и контракт данных в библиотеке классов (dll), а затем добавите ссылку на сборку (т.ссылку на dll или ссылку на проект) в эту библиотеку из двух проектов (серверного проекта и клиентского проекта).Теперь добавьте ссылка на сервис из клиентского проекта в конечную точку сервера (.svc).Если вы используете VS2008, он автоматически проверит локальные ссылки на типы и будет использовать их вместо генерации прокси, то есть:ваш клиентский код использует IwcfServerSync
из библиотеки классов, которая уже знает, стоит ли использовать HashSet<T>
и т. д.