带有查询字符串的WCF帖子

时间:2012-06-29 11:40:46

标签: .net wcf operationcontract webinvoke

我目前正在开发Windows Service托管的WCF服务。其中一种方法具有URI,该URI设置为从支付提供商接收回调。这是接口合同......

    [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参数,只有流,我们可以获取发布数据。这在实践中不起作用,因为我还需要查询字符串参数。

有人可以建议如何解决这个问题吗?我真的很茫然。

提前致谢,

大卫

2 个答案:

答案 0 :(得分:8)

您可以访问查询字符串“id”值,如下所示

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

现在,只有一个参数可用于类型流的方法。

答案 1 :(得分: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