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

时间:2012-02-08 08:10:00

标签: c# wcf

我需要一种方法来配置我的契约(方法)以获取可变数量的参数。因为您应该能够将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个方法来处理每个额外的参数......

3 个答案:

答案 0 :(得分:1)

这似乎不受支持。

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

  

您可以通过以下方式获得所需的效果   从中省略查询字符串   UriTemplate在您的WebGet或   WebInvoke属性,并使用   WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters   从你的处理人员中检查,   在查询上设置默认值等   参数。

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=451296&wa=wsignin1.0

从SO:Optional query string parameters in URITemplate in WCF?

答案 1 :(得分:1)

通过以下方式解决了我自己的问题:

  • 安装网址重写2.0(link
  • 通过我的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。