3

現在、Windows サービスでホストされている WCF サービスを開発しています。メソッドの 1 つには、支払いプロバイダーからのコールバックを受信するように設定された URI があります。これはインターフェイス コントラクトです...

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

私が抱えているこの問題は、サードパーティのプロバイダーが私たちのサービスに投稿することです. コールバック URL を提供する必要があります。支払いを調整できるように、トランザクション ID を含むクエリ文字列パラメーターを含む URL を提供します。

このサービスの開発中、コールバックは成功しています。(これはSteamパラメータを追加する前でした)

ただし、現在、投稿されたデータを解析する必要がある段階にあります。これは、メソッド シグネチャに 2 番目の「Stream」パラメータが追加された点です。

私が得ている問題は、次の例外が発生することです...

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

id パラメータを削除し、ストリームのみにすることで、投稿データを取得できます。ただし、文字列パラメーターもクエリする必要があるため、これは実際には機能しません。

誰でもこの問題を解決する方法についてアドバイスできますか? 私は本当に途方に暮れています。

前もって感謝します、

デビッド

4

2 に答える 2

9

以下に示すように、クエリ文字列の「id」値にアクセスできます

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

これで、ストリーム型のメソッドにパラメーターを 1 つだけ持つことができます。

于 2012-06-29T13:20:09.140 に答える
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 フォーラム

于 2016-04-14T21:39:05.150 に答える