none
咨询一个WCF问题,能否像DATAService一样,通过一个svc同时提供多个服务? RRS feed

  • 问题

  • 我的一个客户有这样的需求:通过WebService公开数据表,并可以进行增删改查功能。

    输入参数:表名、【字段列表】、操作

    输出:xml格式结果。

    考虑了很久,也没有想到好的方案。

    现在打算将所有的表分别产生一个实体类(数据契约),再对应一个服务类(操作契约以公开增删改查方法),

    然后由一个svc或者入口,根据输入参数指定的表名调用对应的服务类,

    如访问http://localhost/abc.svc/Customer就自动返回Customer表的xml数据,访问http://localhost/abc.svc/Order就返回Order的数据

    这样是否可行(比如用工厂方法),如何进行呢,最好能给出svc的创建服务代码,感激不尽!

    例如:

    [OperationContract]

    [WebInvoke]

    List<object> GetALL(string tablename);

    当访问abc.svc/Customers 返回 List<Customer>

    当访问abc.svc/Orders 返回 List<Order>

    但照这个思路写出来的代码是失败的,求版主指点迷津。

    • 已编辑 trulyzhu 2012年2月13日 8:37
    2012年2月13日 2:48

答案

  • 根据你的需求,我建议你使用Rest  WCF,这样做起来简单,只返回XML格式的数据。List<object>,这种方式在WCF是不行的,WCF的数据契约会继承机制有限制,考虑到你的数据库表很多,所以这样做会带来很大的复杂性。

    使用Rest WCF,你可以定义增删改查操作,只返回XML数据格式,相对容易很多。而客户端请求的每个表可以作为参数实现如下格式:

    当访问abc.svc/Customers 返回 List<Customer>

    当访问abc.svc/Orders 返回 List<Order>;你可以参考一下我的文章,之前讲的课里也有一节http://social.msdn.microsoft.com/Forums/zh-CN/wcfzhchs/thread/fb809501-8284-46c6-9389-2f29d163ee08。关于REST WCF的例子代码

    WCF与Ajax开发实践系列课程(7):构建Rest WCF 服务。如果下载不了你可以直接到这个文章里下载:WCF4.0新特性体验(4):Rest In WCF4.0

    :一下是简单的例子参考:

    [WebGet(UriTemplate = "/Rest4/Get/{id}")]
    public string GetData(string id)
            {
    return "Hello Rest";
            }
            [WebInvoke(UriTemplate = "/Rest4/Add/{id}", Method = "PUT")]
    public string AddData(string id)
            {
    return "Hello Rest";
            }
            [WebInvoke(UriTemplate = "/Rest4/Update/{id}", Method = "POST"),]
    public string UpdateData(string id)
            {
    return "Hello Rest";
            }
    [WebInvoke(UriTemplate = "/Rest4/Delete/{id}", Method = "DELETE")]
    public string DeleteData(string id)
            {
    return "Hello Rest";
            }

    这个方案应该很适合你的需求


    Frank Xu Lei--谦卑若愚,好学若饥
    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    • 已标记为答案 trulyzhu 2012年2月17日 1:14
    2012年2月14日 2:57
    版主

全部回复

  • 根据你的需求,我建议你使用Rest  WCF,这样做起来简单,只返回XML格式的数据。List<object>,这种方式在WCF是不行的,WCF的数据契约会继承机制有限制,考虑到你的数据库表很多,所以这样做会带来很大的复杂性。

    使用Rest WCF,你可以定义增删改查操作,只返回XML数据格式,相对容易很多。而客户端请求的每个表可以作为参数实现如下格式:

    当访问abc.svc/Customers 返回 List<Customer>

    当访问abc.svc/Orders 返回 List<Order>;你可以参考一下我的文章,之前讲的课里也有一节http://social.msdn.microsoft.com/Forums/zh-CN/wcfzhchs/thread/fb809501-8284-46c6-9389-2f29d163ee08。关于REST WCF的例子代码

    WCF与Ajax开发实践系列课程(7):构建Rest WCF 服务。如果下载不了你可以直接到这个文章里下载:WCF4.0新特性体验(4):Rest In WCF4.0

    :一下是简单的例子参考:

    [WebGet(UriTemplate = "/Rest4/Get/{id}")]
    public string GetData(string id)
            {
    return "Hello Rest";
            }
            [WebInvoke(UriTemplate = "/Rest4/Add/{id}", Method = "PUT")]
    public string AddData(string id)
            {
    return "Hello Rest";
            }
            [WebInvoke(UriTemplate = "/Rest4/Update/{id}", Method = "POST"),]
    public string UpdateData(string id)
            {
    return "Hello Rest";
            }
    [WebInvoke(UriTemplate = "/Rest4/Delete/{id}", Method = "DELETE")]
    public string DeleteData(string id)
            {
    return "Hello Rest";
            }

    这个方案应该很适合你的需求


    Frank Xu Lei--谦卑若愚,好学若饥
    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    • 已标记为答案 trulyzhu 2012年2月17日 1:14
    2012年2月14日 2:57
    版主
  • 谢谢,今天才来看到回复,曾经尝试和搜索了很多相关文章,均不能实现最初的思路,后来改用string类型传递xml格式数据,跟您的答复吻合,您的回答很细致,非常感谢!

    我拜读了您的很多文章,并且此前果断购入了您翻译的《WCF服务编程》一书,这里还有个想法,此书里面第三章数据契约部分有个泛型解析器的介绍,但是比较难懂,虽然我下载了书籍的源码,但是里面只有完整的泛型解析类(GenericResolver等),却没有具体的使用方法,希望有时间的时候能够写篇文章实例演示一下WCF中的泛型相关处理。

    另外还想知道为什么WCF Data Service就可以跟edmx很好的结合并能有“服务.svc/实体集”直接返回List<T>这种效果

    比如我自己定义很多实体,然后通过一个自定义的Data Service实现数据的增删改(因为增删改时还有些特定业务)

    可惜微软不公布源码,难以窥视真相,网上此类资料太少!




    • 已编辑 trulyzhu 2012年2月17日 1:31
    2012年2月17日 1:26