Вопрос

я использую 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> и т. д.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top