HashSet в WCF - PullRequest
       23

HashSet в WCF

3 голосов
/ 10 мая 2009

Я использую HashSet в своем интерфейсе WCF

[ServiceContract]
public interface IwcfServerSync
{
    [OperationContract]
    void Test(HashSet<int> someHashSet);
}

Когда я создаю ссылку на сервис, HashSet превращается в int [].

Я добавил ServiceKnownType:

[ServiceKnownType(typeof(System.Collections.Generic.HashSet<int>))]

и попробовал какую-то конфигурацию, но не смог ее изменить.

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

Я, вероятно, делаю что-то не так, какие-нибудь указатели или идеи?

1 Ответ

4 голосов
/ 10 мая 2009

Коллекции упрощаются, когда они идут по проводам. Вы можете указать тип коллекции через IDE и командную строку (svcutil /collectionType), но он будет применяться к всем коллекциям в API. Я думаю, что вы должны просто принять это и устранить несоответствие через код. В конечном счете, в сети коллекции представляют собой просто xml (по крайней мере, над стандартными привязками) - что-то вроде:

<items>
   <item ...>...</item>
   <item ...>...</item>
   <item ...>...</item>
</items>

- следовательно, почему он не может определить (из схемы) между массивом (T[]), List<T>, HashSet<T> и MyFunkyCollection<T>.

Обратите внимание, что если вы используете совместное использование сборок (т.е. одна и та же сборка контракта на обслуживание находится на клиентском и сервере), то этого не произойдет, но это противоречит цели SOA / mex. Но этот подход используется довольно часто - следовательно, IDE поддерживает его напрямую и через командную строку через переключатель (svcutil /reference).


Для IDE, поддерживающей его ... если вы записываете контракт на обслуживание и контракт на данные в библиотеке классов (dll), а затем добавляете ссылку на сборку (т.е. ссылку на dll или ссылку на проект) в эту библиотеку из двух проекты (серверный проект и клиентский проект). Теперь добавьте сервисную ссылку из клиентского проекта в конечную точку сервера (.svc). Если вы используете VS2008, он будет автоматически проверять локальные ссылки на типы и использовать их вместо генерации прокси - это означает: ваш клиентский код использует IwcfServerSync из библиотеки классов, которая уже знает, использовать ли HashSet<T> и т. Д.

...