2014-10-16 4 views
1

У меня есть очень простой службы WCF работает на сервере Sharepoint, который имеет ServiceContract, который выглядит примерно так:Переходя перечисление к способу в службе

[ServiceContract] 
interface iSPTest 
{ 
    [OperationContract] 
    Stream Process(Stream input); 
} 

Это прекрасно работает, и я могу используйте svcutil для создания прокси-сервера и файла конфигурации. Тем не менее, я хотел бы изменить его, чтобы принять перечисление:

[OperationContract] 
    Stream Process(Stream input, MyEnumType foo); 

с enum определенными:

[DataContract] 
public enum MyEnumType 
{ 
    [EnumMember] 
    Default = 0, 
    [EnumMember] 
    Foo, 
    [EnumMember] 
    Bar 
}; 

Однако, когда я делаю это, я больше не могу получить прокси-сервер для генерации. Я получаю сообщение об ошибке:

Metadata contains a reference that cannot be resolved: 'http://myserver/_vti_ 
bin/SPTest/SPTest.svc'. 

The requested service, 'http://myserver/_vti_bin/SPTest/SPTest.svc' could not 
be activated. See the server's diagnostic trace logs for more information. 

Кажется, что это должно быть просто. Я попытался добавить ServiceKnownType в ServiceContract, но это, похоже, не помогло. Почему кажется, что невозможно выбрать тип перечисления? Для бонусных очков можно ли использовать существующее перечисление в сборке, которое сервер ссылается, но клиент не делает этого? Потому что в этом случае невозможно было бы отметить enumDataContract?

ответ

1

Проблема не в перечислении. Это связано с концепцией потоковой передачи WCF. У вас есть веб-метод, который принимает два параметра, первый из которых имеет тип Stream. Это не поддерживается, поскольку параметр, который содержит потоки данных, может существовать как единственный в этом методе. См. here.

Я думаю, что с вашей текущей OperationContract вы получите InvalidOperationException, если попытаетесь создать хост-службу, заявив, что операция должна иметь один параметр, тип которого является Stream.

Вы можете обходить это путем введения нового типа и инкапсулирования вашего потока и перечисления внутри него.

+0

Хорошо, это звучит правильно. Поиск еще немного: http://cm-bloggers.blogspot.com/2011/06/wcf-pattern-passing-additional-data-to.html выглядит как правильный подход. –

+0

Интересно, что при использовании контракта с пользовательским сообщением 'MySteam' это не сработает, если бы у меня был« Stream Process (вход в MySteam) », он должен был быть« MySteam Process (вход в MySteam) », а прокси настаивал на создании метода с сигнатурой 'void Process (ref myEnum foo, ref Stream input);' –

Смежные вопросы