2012-03-28 2 views
2

Я пытаюсь создать Restful WCF Service. В моей службе WCF я ссылаюсь на 1 dll, которая содержит уровень доступа к данным.Служба WCF REST с общей коллекцией

У меня есть следующий метод в моем классе WCF

public class Search : ISearch 
{ 

    public List<Product> GetProductList() 
    { 
     ProductDA dataAccess = new ProductDA(); 
     List<Product> obj = new List<Product>(); 
     obj = dataAccess.GetProducts(); 
     return obj; 
    } 

} 

Мой интерфейс содержит OperationContract следующим образом:

[ServiceContract] 
public interface ISearch 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "getProductList", RequestFormat = WebMessageFormat.Xml, ResponseFormat WebMessageFormat.Xml)] 
    List<Product> GetProductList(); 
} 

Когда я бегу URL http://localhost:36741/RestService/Search.svc/getFoodTruckNameList в браузере я получаю следующее сообщение об ошибке: Сервер обнаружил ошибку при обработке запроса

Кто-нибудь знает правильный код для вызова [Operat ionContract] для List<Product> GetProductList();?

Заранее спасибо. Вытягивали мои волосы на этом некоторое время.

+0

Эта ошибка, как правило, означает, что ваш код выбрал исключение. Вы пробовали отлаживать свой веб-сервис? –

+0

Вам нужно получить дополнительную информацию об ошибке, попробуйте подключить отладчик и опубликовать данные об исключении. Вот мой простой пример того, как настроить/настроить WCF для использования отдыха, который может дать вам несколько указателей. Http://blog.staticvoid.co.nz/2012/02/using-rest-wcf-service.html –

ответ

0

У нас часто возникали проблемы с возвратом общего списка в качестве ответа на службу WCF.

Простым способом решения является создание класса, который имеет одно свойство, которое является общим списком, а затем возвращает этот класс.

[DataContract] 
public class Class1 
{ 
    [DataMember] 
    public List<Foo> Foos { get; set; } 
} 
+1

Или просто ваш пользовательский класс наследуется от 'List '. Это будет препятствовать получению большего количества уровней XML, чем необходимо. –

+0

@Shiraz Я думаю, что вы на правильном пути. Не могли бы вы опубликовать фрагмент кода для создания класса с единственным свойством, который является общим списком, а затем вернуть этот класс? Спасибо человеку ... – midnightCoder

+0

@M. Бэбкок. Ты и я, т. Е. Движемся в правильном направлении от того, что я исследовал ранее. Не могли бы вы разместить код для наследования? Я имею в виду, что это не будет public class Search: ISearch: List Право? – midnightCoder

3

Глядя на мои RESTful веб-сервисы, которые делают что-то вроде этого, я обычно сделать что-то ближе к:

[CollectionDataContract] 
public class Products : List<Product> 
{ 
    public Products(IEnumerable<Product> products) : base(products) { } 
} 

Тогда ваш интерфейс будет как:

[ServiceContract] 
public interface ISearch 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "getProductList", RequestFormat = WebMessageFormat.Xml, ResponseFormat WebMessageFormat.Xml)] 
    Products GetProductList(); 
} 

и тогда ваш контракт на обслуживание будет выглядеть так:

public class Search : ISearch 
{ 
    public Products GetProductList() 
    { 
     return new Products(new ProductDA().GetProducts()); 
    } 
} 
+0

Моя единственная путаница здесь является первый раздел [CollectionDataContract] класса продуктов общественного: Список { общественные товары (IEnumerable продукты): база (продукты) {}} Моя WCF служба referncing библиотеку DLL который содержит объекты данных Product и DAL. Это где код выше? – midnightCoder

+0

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

+0

Я предпочитаю хранить DLL только с объектом данных и DAL. Все еще запутался в этой части, но я посмотрю позже этим вечером и посмотрю, смогу ли я заставить его работать. – midnightCoder

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