2011-01-19 9 views
1

У меня есть простая служба WCF, определенная следующий ServiceContract:службы WCF REST не возвращает DataContract объекта

[ServiceContract] 
public interface IInventoryService 
{ 
    [OperationContract]  
    Item GetItemFromBarcode(string barcode); 

    [OperationContract] 
    string Test(string testString); 
} 

С Предметом определенного следующим образом:

[DataContract] 
public class Item 
{ 
    [DataMember] 
    public virtual int Id { get; set; } 

    <Snip> 
} 

И фактическая служба реализована таким образом:

public class InventoryService : IInventoryService 
{ 
    [WebGet(UriTemplate = "/Barcode/{barcode}/Item", ResponseFormat = WebMessageFormat.Json)] 
    public Item GetItemFromBarcode(string barcode) 
    { 
    var item = (from b in repository.Query<ItemBarcode>() 
      where b.BarcodeData == barcode 
      select b.Item).FirstOrDefault(); 
    return item; 

    } 

    [WebGet(UriTemplate = "/Test/{testString}",ResponseFormat=WebMessageFormat.Xml)] 
    public string Test(string testString) 
    { 
    return testString; 
    } 
} 

В программе app.config содержится следующее:

<system.serviceModel>  
    <behaviors> 
    <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpGetEnabled="true"/> 
     </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
     <behavior name="RESTFriendly"> 
      <webHttp /> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 
    <services> 
    <service name="InventoryService">    
     <endpoint address="/Inventory" behaviorConfiguration="RESTFriendly" binding="webHttpBinding" contract="IInventoryService"/> 
     <host> 
      <baseAddresses> 
       <add baseAddress="http://localhost:8080/"/> 
      </baseAddresses> 
     </host> 
    </service> 
    </services> 
</system.serviceModel> 

Теперь, когда код дампа из пути, вопрос: я могу вызвать метод Test просто отлично с завитком или Скрипач, он возвращает последовательную строку. Однако вызов метода, возвращающего объект, ничего не возвращает. Curl плюет назад curl: (56) Failure when receiving data from the peer и Fiddler отвечает ReadResponse() failed: The server did not return a response for this request.

Из того, что я читал, это должно просто работать (tm). Есть ли что-то очевидное, что мне не хватает?

+0

Возможно ли, что исключение происходит в GetItemFromBarcode? Возможно, вам нужно просто изменить элемент, созданный в строке, чтобы убедиться, что ваша конфигурация WCF верна, поскольку обработка исключений в WCF REST немного запутана. В качестве альтернативы, каков остальной класс Item, возможно, это проблема сериализации? Вы также можете включить трассировку WCF. –

+0

@James Webster, исключение не бросается, что я могу найти (я сказал Visual Studio, чтобы разбить все исключения). На самом деле, я думаю, я только что разобрался в этом вопросе. –

ответ

1

Таким образом, у вас не может быть DataMember типа интерфейса, например IList<ItemBarcode>. Я надеюсь, что мои объекты модели NHibernate будут использоваться как DTO.

+1

Да, это правильно, я полагаю, потому что десериализатор не знает, какой конкретный тип создать. WCF может сделать предположение о том, какую реализацию использовать; но это, вероятно, нарушит ряд вариантов использования. Следовательно, WCF требует конкретных типов (в большинстве случаев). Думаю, использование объектов NHibernate как DTO было бы проблематичным. Может быть, вам стоит рассмотреть отдельный уровень DTO и использовать AutoMapper для упрощения сопоставления в обоих направлениях (возможно, даже для кода DTO с использованием T4?) –

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