我需要一种方法来配置我的契约(方法)以获取可变数量的参数。因为您应该能够将2或10个参数传递给此终点。
顺便说一句,我返回Stream
的原因是因为我手动将数据序列化为XML(不重要)。
serviceInterface等
[OperationContract]
Stream UpdateAgent(string token, string agentId, string newAgentName, string param1);
服务实施:
[WebGet(UriTemplate = "/update_agent/{token}/{agentId}/{newAgentName}/{param1}")]
public Stream UpdateAgent(string token, string agentId, string newAgentName, string param1)
{
//do stuff here
}
此方法仅适用于此URI请求:
/update_agent/<long number of chars and numbers>/123456/John Silver/<some ID of associated data>
但是如果我愿意的话,我希望能够传递更多的字符串。我知道这改变了合同的终点 - 但是这可能吗?
为了澄清,以下内容应触发相同端点:
/update_agent/<long number of chars and numbers>/123456/John Silver/dom_81/pos_23
/update_agent/<long number of chars and numbers>/123456/John Silver/dom_120/dat_12/pos_10
/update_agent/<long number of chars and numbers>/123456/John Silver/con_76
任何人都可以帮助我 - 因为显然我不能制作10,000个方法来处理每个额外的参数......
答案 0 :(得分:1)
这似乎不受支持。
然而,微软已经意识到这个问题并且有一个解决方法:
您可以通过以下方式获得所需的效果 从中省略查询字符串 UriTemplate在您的WebGet或 WebInvoke属性,并使用 WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters 从你的处理人员中检查, 在查询上设置默认值等 参数。
答案 1 :(得分:1)
通过以下方式解决了我自己的问题:
Web.config
文件配置重写规则: Web.config部分:configuration/system.webServer/
<rules>
<rule name="UpdateAgentUrlRewrite" stopProcessing="true">
<match url="^service/update_agent/([^/]+)/(agent_\d+)/([^/]+)/(.*)$" />
<action type="Rewrite" url="Service.svc/update_agent/{R:1}/{R:2}/{R:3}?input={R:4}" appendQueryString="false" logRewrittenUrl="true" />
</rule>
</rules>
我做的这个正则表达式将转换这样的URL:
/service/update_agent/123a456b789c012d/agent_1/New Agent Name/d_1/e_2/f_3/g_4
||
/Service/update_agent/123a456b789c012d/agent_1/New%20Agent%20Name?input=d_1/e_2/f_3/g_4
这意味着无论我在URL中追加多少,我都可以点击相同的服务端点,然后只需使用以下代码提取查询参数:
var context = WebOperationContext.Current;
if(context != null)
{
NameValueCollection queryParams = context.IncomingRequest.UriTemplateMatch.QueryParameters;
//contains a keyvalue pair:
// {
// key = "input";
// value = "e_2/f_3/g_4";
// }
}
答案 2 :(得分:1)
你可以这样做一个模板:
/update_agent/{token}/{agentId}/{newAgentName}/{*params}
将路径的其余部分放入params变量中,然后在方法中为自己解析每个param。