2016-03-03 3 views
1

Я создаю распределенное (клиент-сервер .NET) .NET-приложение, используя WCF. Как вы можете видеть в приведенном ниже коде, я хотел бы использовать System.Type в одном из своих DataContrac для отправки типов параметров. Однако я всегда получаю исключение, когда я делаю это так. Все остальное работает, значит, когда я удаляю свойство System.Type, он работает хорошо.Использовать System.Type в WCF Datacontract

[DataContract] 
    public class PluginParametersItemDto 
    { 
    [DataMember] 
    public String Name { get; set; } 

    [DataMember] 
    public Type Type { get; set; } 

    [DataMember] 
    public Object Value { get; set; } 

    public PluginParametersItemDto(String name, Type type, Object value) 
    { 
     this.Name = name; 
     this.Type = type; 
     this.Value = value; 
    } 
    } 

Кто-нибудь Идея, как я мог передать общие определения типов моему клиенту? Или это даже возможно?

+0

Похоже, вы не можете: http://stackoverflow.com/questions/10500870/serialize-generic-type-over-wcf-service Поскольку под обложкой WCF отправляет XML через провод, наиболее общий тип будет XML или, может быть, просто сообщение. – MatthewMartin

+0

Не могли бы вы опустить тип из контракта и установить его в своем конструкторе с помощью «this.Type = typeof (value)»? –

+0

Обходной путь с typeof() не работает. – sharpy

ответ

-1

Это из-за сериализации по умолчанию, которая использует DataContractSerializer. Попробуйте переключить как ваш клиент, так и сервер, чтобы использовать NetDataContractSerializer, который использует информацию типа .NET. В этом случае ваш сервис не будет совместим со стандартными веб-службами, но пока вы уверены, что обе стороны написаны на .NET, все будет в порядке.

+1

Wil не работает. Нет, если я правильно прочитал вопрос. – TomTom

0

Ваш подход нарушен принципиально.

Вы не можете отправить тип - вам нужно отправить сборку, в которой она находится (это массив байтов). Типы представлены в представлении памяти, и они могут полагаться на другие типы.

Теперь, если у вас есть сборка с другой стороны - не отправляйте тип (как и вы), но полное имя типа, то вы можете его создать. Но если я прочитаю это правильно, и это будет установка плагина, то я думаю, что у вас есть проблема, что на самом деле у вас нет типа на принимающей стороне - и тогда все становится немного сложнее.

+0

Это звучит очевидно. Да, его настройка плагина, и у меня нет сборки на стороне клиента. На стороне клиента находится веб-сайт ASP.NET MVC, где я хочу отобразить форму с типами параметров из реализации плагина. Параметры - это свойства, которые украшены определенным атрибутом. – sharpy

+0

Затем вам нужно отправить имя, и я бы сказал что-то вроде конфигурации, клиент затем загружает это. Я бы упаковал плагин в zip-файл, потому что довольно часто вам также понадобятся o дополнительные файлы dll или возможные файлы ressource для загрузки. Не забудьте указать местоположение загрузки в соответствии с правилами Windows и REMBMER SECURITY. – TomTom

+0

Хорошо, мне кажется, что мне нужно полностью изменить свой подход. Спасибо за ваши советы. – sharpy