我试图休息 - 如果我们现有的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声明肯定不会起作用,但这就是我将输入查询变量映射到该对象的属性之一的意图。这可能吗?
提前告诉你的帮助。
答案 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,您必须手动执行此操作。