2013-12-24 2 views
0

Работа с сервисом WCF У меня возникла следующая проблема: вызов службы с клиента (простое консольное приложение), я не могу получить доступ к методу класса, помеченного с помощью [DataContract] и [ServiceContract], даже если этот метод отмечен [OperationContract] (на самом деле, я уже пробовал все возможные комбинации атрибутов: D). Есть ли способ разрешить это? Я пропускаю некоторые моменты здесь, я думаю, но до сих пор не могу справиться с этим, нужна своей помощью ^^ Вот код класса:Сервисный контракт WCF; вызов метода класса из клиента

[ServiceContract] 
[DataContract] 
public class AmountSpecification : IOrderSpecification 
{ 
    [DataMember] 
    public int Amount {get ; set;} 

    public AmountSpecification(int amount) 
    { 
     Amount = amount; 
    } 
    public bool IsSatisfiedBy(Order o) 
    { 
     return o.Amount >= Amount; 
    } 

    [OperationContract] 
    public IOrderSpecification And(IOrderSpecification specification) 
    { 
     return new AndSpecification(this, specification); 
    } 

} 
+1

Вы должны добавить свой код на свой вопрос. – ken2k

+0

Вы должны украсить свое обслуживание ServiceContract - или даже лучше, чтобы IOrderSpecification была украшена ServiceContract, а затем создала отдельный класс данных с атрибутами DataContract и DataMember. –

+0

Он был уже оформлен таким образом :( –

ответ

0

Ваш метод возвращает IOrderSpecification.

Таким образом, на стороне клиента нет указаний на использование реализации (AmountSpecification, AndSpecification и т. Д.), И поэтому клиент не будет создавать правильный тип экземпляра.

Вам необходимо добавить Well Known Types attribute на свой интерфейс. Это позволит wsdl содержать определения для реализации, и поэтому клиент будет иметь информацию.

+0

Но разрешено ли ассоциировать известные типы с интерфейсом? Не похоже на то, что ... –

+0

Итак, вам просто нужно использовать базовый класс вместо интерфейса – Fabske

+0

Итак, я создал базовый класс вместо интерфейса и использовал составную спецификацию вместо составления спецификаций в клиентском коде. Спасибо за все ваши советы! –

0

Вы путаете контракт на обслуживание и контракт данных в одном классе. Для создания контракта с данными вам нужны только атрибуты DataContract и DataMember, и это даже не требуется.

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

Если вы хотите использовать класс в своей enitrety, вам нужно ссылаться на сборку, в которой этот класс определен в приложении клиента, и проверить «Типы повторного использования в ссылочных ассемблерах» в вашей конфигурации справочной службы. См. Service reference complex types.

+0

Спасибо за комментарий, но у меня есть уже сделал это :(Не работает для меня, к сожалению –

+0

«Не работает» не является ошибкой. Удалите ссылку на службу, добавьте ссылку на сборку, где определена спецификация «AmountSpecification», и заново создайте ссылку на службу с помощью «Повторное использование» типы из ссылочных сборок ". – CodeCaster

+0

Это уже сделано :) Получение« ... AmountSpecification не содержит определения для «И» ... » –

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