none
是否能够实现 UriTemplate 与 Data 属性(我希望是 Name)挂钩,即根据 数据的名字 自动生成 Uri 模板? RRS feed

  • 问题

  • 我在学习创建一个 wcf rest-ful 服务。

    这是一个系统自动生成的一部分,我的数据是MyData

    public interface IService
    {
            [OperationContract]
            [WebInvoke(UriTemplate = "MyData/{id}", Method = "GET", ResponseFormat = WebMessageFormat.Json)]
            MyData Get(string id);
    }

    我希望UriTemplate能够像这样 {DataName}/{id} ...,并且IService能够接收泛型参数,比如 Student,book。

    public interface IService<T> where T : class
    {
            [OperationContract]
            [WebInvoke(UriTemplate = "{T}/{id}", Method = "GET", ResponseFormat = WebMessageFormat.Json)]
            T Get(string id);
    }

    我尝试过在运行时修改 UriTemplate,但似乎并没有效果。

    大家有什么想法么?

    我试过这样设置路由,虽然能够工作,但是我感觉应该有更好的方法。

    RouteTable.Routes.Add(new ServiceRoute("TestService/MyData",
                new WebServiceHostFactory(), typeof(TaskService)));


    2018年2月5日 3:43

答案

  • Hi Keaghen,

    >>我希望UriTemplate能够像这样 {DataName}/{id} ...,并且IService能够接收泛型参数,比如 Studentbook

    在我看来,这是不可能的。对于UriTemplate, 参数T的值是需要从方法参数里面提取的,针对于你的情况,“{T}”UriTemplate里面是一个字符串,而T 作为返回值是class对象。

    下面定义Interface方式能满足你的要求么?

    public interface IService<T> where T : class
    {
            [OperationContract]
            [WebInvoke(UriTemplate = "{TObjectName}/{id}", Method = "GET", ResponseFormat = WebMessageFormat.Json)]
            T Get(string TObjectName,string id);
    }

    Best Regards,

    Tao Zhou


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 Keaghen 2018年2月16日 8:56
    2018年2月6日 2:33
    版主

全部回复

  • Hi Keaghen,

    >>我希望UriTemplate能够像这样 {DataName}/{id} ...,并且IService能够接收泛型参数,比如 Studentbook

    在我看来,这是不可能的。对于UriTemplate, 参数T的值是需要从方法参数里面提取的,针对于你的情况,“{T}”UriTemplate里面是一个字符串,而T 作为返回值是class对象。

    下面定义Interface方式能满足你的要求么?

    public interface IService<T> where T : class
    {
            [OperationContract]
            [WebInvoke(UriTemplate = "{TObjectName}/{id}", Method = "GET", ResponseFormat = WebMessageFormat.Json)]
            T Get(string TObjectName,string id);
    }

    Best Regards,

    Tao Zhou


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 Keaghen 2018年2月16日 8:56
    2018年2月6日 2:33
    版主
  • 感谢,看起来只有这样或者通过设置 RouteTable.Routes 来实现了。
    2018年2月16日 8:58