2012-06-29 80 views
3

我目前正在開發Windows服務託管的WCF服務。其中一種方法的URI設置爲接收來自支付提供商的回叫。這是接口合同...帶查詢字符串的WCF帖子

[OperationContract] 
    [WebInvoke(UriTemplate = "3DSecureCallback?TrxId={id}", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)] 
    void ThreeDSecureCallBack(string id, Stream body); 

我遇到的這個問題是第三方提供商發佈到我們的服務。我必須爲其提供回調網址。因此,我們可以協調付款,我們提供一個包含事務ID的查詢字符串參數的URL。

在此服務的開發過程中,回調已成功。 (這是在添加Steam參數之前)

但是,我們現在處於需要解析發佈數據的階段。這是第二個'Stream'參數添加到方法簽名中的一點。

,我得到的問題是,我收到以下異常...

For request in operation ThreeDSecureCallBack to be a stream the operation must have a single parameter whose type is Stream. 

通過刪除ID參數,並具有流而已,我們可以得到這個職位數據。這實際上不會工作,因爲我也需要查詢字符串參數。

任何人都可以建議如何解決這個問題嗎?我真的很茫然。

由於提前,

大衛

回答

8

您可以訪問查詢字符串「ID」值,如下圖所示

WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["id"]

現在,你只能有一個參數,以你的類型的方法流。

+0

感謝這個! :) –

3

喚醒一箇舊的線程,但認爲這會有助於記錄另一種方式。

將WeInvoke方法的BodyStyle更改爲Wrapped將解決您的問題 其中假定UriTemplate上未指定的任何參數來自請求主體。

唯一的缺點是您必須將自己的發佈數據封裝起來......並且要麼使用內置數據類型作爲額外參數,要麼定義您自己合適的DataContract。

例子:

[DataContract] 
public class PostInfo 
{ 
    [DataMember] 
    public string Info1; 
    [DataMember] 
    public string Info2; 
} 

[OperationContract] 
[WebInvoke(UriTemplate = "3DSecureCallback?TrxId={id}", Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped)] 
void ThreeDSecureCallBack(string id, PostInfo body); 

來源: msdn Forums