【问题标题】:WCF REST Service with Generic Collection具有通用集合的 WCF REST 服务
【发布时间】:2012-03-28 19:30:58
【问题描述】:

我正在尝试构建一个 Restful WCF 服务。在我的 WCF 服务中,我引用了 1 个包含数据访问层的 dll。

我的 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 时,我收到以下错误: 服务器处理请求时遇到错误

有人知道为List&lt;Product&gt; GetProductList(); 调用[OperationContract] 的正确代码吗?

提前致谢。有一段时间一直在这上面拔头发..

【问题讨论】:

  • 该错误通常意味着您的代码引发了异常。您是否尝试过调试您的网络服务?
  • 您需要获取有关错误的更多详细信息,尝试附加调试器并发布异常详细信息。这是我关于如何设置/配置 WCF 以使用 rest 的简单示例,这可能会给您一些指示blog.staticvoid.co.nz/2012/02/using-rest-wcf-service.html

标签: c# wcf rest


【解决方案1】:

看看我的 RESTful Web 服务做这样的事情,我通常做的事情更接近:

[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());
    }
}

【讨论】:

  • 我唯一的困惑是第一部分 [CollectionDataContract] public class Products : List { public Products(IEnumerable products) : base (products) { } } 我的 WCF 服务正在引用一个包含产品数据对象和 DAL 的 dll。那是上面的代码吗?
  • 我把它放在我的项目中,但如果你更喜欢把它放在你的 BLL 中,那么它可能也可以在那里工作。
  • 我更喜欢将 DLL 与数据对象和 DAL 单独保存。在这部分仍然很困惑,但我会在今晚晚些时候看看,看看我能不能让它工作..谢谢..
【解决方案2】:

我们经常在返回通用列表作为对 WCF 服务的响应时遇到问题。

解决这个问题的简单方法是创建一个具有单个属性的类,即通用列表,然后返回这个类。

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

【讨论】:

  • 或者只是让您的自定义类继承自List&lt;T&gt;。这将防止它生成不必要的 XML 级别。
  • @Shiraz 我认为你在正确的轨道上。您能否发布一个代码 sn-p 来创建具有单个属性的类,即通用列表,然后返回这个类?谢谢大佬...
  • @M. Babcock 你也是我认为从我之前研究的方向正确的方向。你能把代码贴在哪里继承吗?我的意思是它不会是公共类 Search : ISearch : List 对吗?
  • @midnightCoder - 用我的意思添加了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
相关资源
最近更新 更多