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个方法来处理每个额外的参数。。。

WCF-操作合约和灵活的URI模板

这似乎不受支持。

然而,微软已经意识到了这个问题,并且有一个解决方案:

您可以通过以下方式获得所需效果从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。