【问题标题】:WCF Post with Query String带有查询字符串的 WCF 发布
【发布时间】:2012-06-29 11:40:45
【问题描述】:

我目前正在开发一个 Windows 服务托管的 WCF 服务。其中一种方法有一个 URI,该 URI 被设置为接收来自支付提供商的回调。这是接口契约……

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

我遇到的这个问题是第 3 方提供商发布到我们的服务。我必须为其提供一个回调 url。所以我们可以协调付款,我们提供一个带有查询字符串参数的 URL,其中包含交易 ID。

在此服务的开发过程中,回调已经成功。 (这是在添加 Steam 参数之前)

但是,我们现在处于需要解析发布数据的阶段。这就是将第二个“Stream”参数添加到方法签名中的地方。

我遇到的问题是我收到以下异常...

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

通过去掉id参数,只有stream,我们可以得到post数据。这在实践中不起作用,因为我还需要查询字符串参数。

谁能告诉我如何解决这个问题?我真的很茫然。

提前致谢,

大卫

【问题讨论】:

    标签: .net wcf operationcontract webinvoke


    【解决方案1】:

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

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

    现在您的流类型方法只能有一个参数。

    【讨论】:

      【解决方案2】:

      唤醒一个旧线程,但认为记录另一种方法会有所帮助。

      将 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

      【讨论】:

        猜你喜欢
        • 2018-05-15
        • 2012-05-12
        • 1970-01-01
        • 2016-09-25
        • 2010-12-31
        • 1970-01-01
        • 2010-11-14
        • 2012-03-23
        • 2011-11-28
        相关资源
        最近更新 更多