2012-02-08 49 views
1

我需要一種方法來配置我的合同(方法)以獲取可變數量的參數。因爲你應該能夠傳遞2或10個參數到這個終點。WCF - 操作合同和靈活的URI模板?

順便說一句,我返回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 

誰能幫助我 - 因爲我顯然不能讓萬種方法服用,每次額外的參數的照顧...

回答

1

我已經解決我自己的問題,通過執行以下操作:

  • 安裝URL重寫2.0(link
  • 配置重寫通過我的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"; 
    // } 
} 
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?

+0

感謝您的回答。我已經閱讀了它,嘗試了一些東西,並查看了「WebOperationContext」以瞭解我可以用這個做什麼。儘管我對可選的查詢參數不感興趣 - 我需要觸發我的操作,無論我在其中觸發了多少個參數...... – KristianB 2012-02-08 09:23:44

1

你可以做模板如下:

/update_agent/{token}/{agentId}/{newAgentName}/{*params} 

將其餘路徑放入params變量,然後解析每個參數在自己的方法裏面。

+1

好的......在語法方面,{* params}是否正確? – KristianB 2012-08-21 06:50:19

+0

這是正確的答案。 – 2017-11-06 12:48:34