2009-11-03 47 views
2

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

[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声明肯定是不行的,但是这是我输入查询变量映射到该对象的属性之一的打算..这是可能吗?

提前请求您的帮助。

+0

你可以使用自定义的QueryStringConverter来完成这个工作http://stackoverflow.com/questions/6783264/passing-a-class-as-parameter-in-restful-wcf-service – Schneider 2016-05-25 02:37:06

回答

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... 
} 
0

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