WCF REST服务未返回DataContract对象

WCF REST服务未返回DataContract对象,wcf,datacontract,Wcf,Datacontract,我有一个简单的WCF服务,由以下ServiceContract定义: [ServiceContract] public interface IInventoryService { [OperationContract] Item GetItemFromBarcode(string barcode); [OperationContract] string Test(string testString); } 项目定义如下: [DataContract] public

我有一个简单的WCF服务,由以下ServiceContract定义:

[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>
}
[DataContract]
公共类项目
{
[数据成员]
公共虚拟整数Id{get;set;}
}
以及由此实现的实际服务:

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;
  }
}
公共类清单服务:IInventoryService
{
[WebGet(UriTemplate=“/Barcode/{Barcode}/Item”,ResponseFormat=WebMessageFormat.Json)]
公共项目GetItemFromBarcode(字符串条形码)
{
var item=(来自repository.Query()中的b)
其中b.BarcodeData==条形码
选择b.Item).FirstOrDefault();
退货项目;
}
[WebGet(UriTemplate=“/Test/{testString}”,ResponseFormat=WebMessageFormat.Xml)]
公共字符串测试(字符串测试字符串)
{
返回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>

现在代码转储已经不存在了,问题是:我可以使用curl或Fiddler调用
Test
方法,它返回一个序列化字符串。但是,调用返回对象的方法不会返回任何内容。Curl回吐
Curl:(56)从对等方接收数据时失败,Fiddler响应
ReadResponse()失败:服务器未对此请求返回响应。


从我所读的,这应该只是工作(商标)。有什么明显的我遗漏的吗?

因此,似乎您不能拥有接口类型的
DataMember
,比如
IList
。我希望将我的NHibernate模型对象用作DTO。

因此,似乎您不能拥有接口类型的
DataMember
,如
IList
。我希望将我的NHibernate模型对象用作DTO。

GetItemFromBarcode中是否可能发生异常?可能修改为只返回一个内联创建的项目,以确保WCF配置正确,因为WCF REST中的异常处理有点模糊。或者,Item类的其余部分是什么,可能是序列化问题?您还可以打开WCF跟踪。@James Webster,我找不到的异常没有被抛出(我告诉Visual Studio中断所有异常)。事实上,我想我刚刚解决了这个问题。GetItemFromBarcode中是否可能发生异常?可能修改为只返回一个内联创建的项目,以确保WCF配置正确,因为WCF REST中的异常处理有点模糊。或者,Item类的其余部分是什么,可能是序列化问题?您还可以打开WCF跟踪。@James Webster,我找不到的异常没有被抛出(我告诉Visual Studio中断所有异常)。事实上,我想我刚刚解决了这个问题。是的,我想这是正确的,因为反序列化程序不知道要创建哪个具体类型。WCF可以假设使用哪个实现;但这可能会破坏许多用例。因此,WCF需要具体类型(在大多数情况下)。我认为使用NHibernate对象作为DTO通常会有问题。也许你应该考虑一个单独的DTO层,并使用AutoPad来简化两个方向的映射(甚至是使用T4的DTOS代码Gen?)是的,这是正确的,因为解串器不知道要创建哪种具体的类型。WCF可以假设使用哪个实现;但这可能会破坏许多用例。因此,WCF需要具体类型(在大多数情况下)。我认为使用NHibernate对象作为DTO通常会有问题。也许你应该考虑一个单独的DTO层,并使用AutoAppER来简化两个方向的映射(甚至是使用T4的DTOS代码Gen?)