WCF-操作合约和灵活的URI模板
本文关键字:URI 模板 操作 WCF- | 更新日期: 2023-09-27 18:23:38
我需要一种方法来配置我的合约(方法),使其采用可变数量的参数。因为您应该能够将2个或10个参数传递到此终点。
顺便说一句,我返回Stream
的原因是我手动将数据序列化为XML(这并不重要)。
服务接口:
[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
有人能帮我吗?因为很明显,我无法制作10000个方法来处理每个额外的参数。。。
这似乎不受支持。
然而,微软已经意识到了这个问题,并且有一个解决方案:
您可以通过以下方式获得所需效果从WebGet或上的UriTemplateWebInvoke属性,并使用WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters从您的处理人员内部进行检查,设置查询的默认值等参数。
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=451296&wa=wsignin1.0
来自SO:WCF中URITemplate中的可选查询字符串参数?
我通过以下操作解决了自己的问题:
- 正在安装URL重写2.0(链接)
- 通过我的
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";
// }
}
您可以创建这样的模板:
/update_agent/{token}/{agentId}/{newAgentName}/{*params}
将路径的其余部分放入params变量中,然后在方法中为自己解析每个param。