在启用REST的WCF服务中映射复杂类型

时间:2009-11-03 18:28:39

标签: wcf rest

我试图休息 - 如果我们现有的WCF服务,其中一个障碍是使用Uritemplate映射复杂类型。例如,看看下面的代码

[DataContract]
public class Stock
{
    [DataMember]
    public string Symbol { get;set; }
    [DataMember]
    public double FaceValue { get; set; }
}

[ServiceContract]
public interface IRestService
{       
    [OperationContract]
    [WebGet(UriTemplate = "?Symbol={stk.Symbol}")]
    void Test1(Stock stk); 
}

上面的Uritemplate声明肯定不会起作用,但这就是我将输入查询变量映射到该对象的属性之一的意图。这可能吗?

提前告诉你的帮助。

2 个答案:

答案 0 :(得分:3)

您提供的示例并未说明问题。在这种情况下,所需要的只是传递股票代码,简单的字符串,而不需要复杂的类型。

如果要传递更复杂的数据集,JSON编码的对象,请使用带有PUT或POST的WebInvoke,非参数化的UriTemplate,并传递表单数据。有关详细信息,请参阅this answer

如果您需要GET,并且可以传递一小组离散参数,您可以使用WebGet,一个合适的UriTemplate,并进行手动映射。像这样:

public enum OptionFlavor { Put, Call }
public class OptionInqury { public String Symbol; public String Month; public OptionFlavor Flavor;}

[OperationContract] 
[WebGet(UriTemplate = "/optionquote/{stockSymbol}/{month}/{flavor}")] 
void GetOptionPrice(string stockSymbol, string month, string flavor)
{
   var x = new OptionInquiry { 
       Symbol = stockSymbol, 
       Month = month,
       Flavor = (flavor.Equals("put")) ? OptionFlavor.Put : OptionFlavor.Call
   };
   // off you go...
}

答案 1 :(得分:0)

如果要将查询字符串参数映射到对象中的属性,则需要使用WebInvoke。不幸的是,使用GET,您必须手动执行此操作。