私のWCFサービスが返すものは次のとおりです。ResponseModel から PaymentData を命令し、そのクラスに他の DataMembers を追加すると、機能します。
[DataContract]
public class ResponseModel
{
[DataMember]
public PaymentData PaymentData { get; set; }
}
PaymentData
クラスは次のとおりです。
[DataContract]
public class PaymentData
{
[DataMember]
public PaymentType PaymentType { get; set; }
[DataMember]
public string CardNumber { get; set; }
[DataMember]
public DateTime ExpirationDate { get; set; }
/// <summary>
/// If true, then the CardNumber property will contain the token
/// </summary>
[DataMember]
public bool IsCardNumberTokenized { get; set; }
/// <summary>
/// Number on back of credit cards. This value CANNOT be stored anywhere
/// </summary>
[DataMember]
public string CardSecurityValue { get; set; }
[DataMember]
public CardSecurityPresence CardSecurityPresence { get; set; }
}
PaymentData
...そしてクラスで定義された列挙型
[DataContract(Name = "CardSecurityPresenceEnum")]
public enum CardSecurityPresence
{
[EnumMember(Value = "1")]
IsPresent = 1,
[EnumMember(Value = "2")]
Illegible = 2,
[EnumMember(Value = "9")]
NoCodeOnCard = 9,
[EnumMember(Value = " ")]
NotSent
}
[DataContract(Name = "PaymentTypeEnum")]
public enum PaymentType
{
[EnumMember]
Visa = CMPWSApiService.TransactionMop.VI,
[EnumMember]
MasterCard = CMPWSApiService.TransactionMop.MC,
[EnumMember]
AmericanExpress = CMPWSApiService.TransactionMop.AX,
[EnumMember]
Discover = CMPWSApiService.TransactionMop.DI,
[EnumMember]
PayPal = CMPWSApiService.TransactionMop.PP,
[EnumMember]
BillMeLater = CMPWSApiService.TransactionMop.BL
}
シリアライゼーションは、私の変数名がそれらのクラスと同じ名前を持っているのが好きではありませんか?
WCFTest クライアントからのエラーは次のとおりです。
[サービス URL 省略] への HTTP 応答の受信中にエラーが発生しました。これは、サービス エンドポイント バインディングが HTTP プロトコルを使用していないことが原因である可能性があります。これは、HTTP 要求コンテキストがサーバーによって中止されたことが原因である可能性もあります (サービスのシャットダウンが原因である可能性があります)。詳細については、サーバー ログを参照してください。
サーバー スタック トレース: System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException (WebException webException、HttpWebRequest 要求、HttpAbortReason abortReason) で
System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan タイムアウト) で System.ServiceModel.Channels.RequestChannel.Request(メッセージ メッセージ、TimeSpan タイムアウト) で System.ServiceModel.Dispatcher.RequestChannelBinder.Request(メッセージ メッセージ、TimeSpan) System.ServiceModel.Channels.ServiceChannel.Call(文字列アクション、Boolean oneway、ProxyOperationRuntime 操作、Object[] ins、Object[] outs、TimeSpan タイムアウト) で System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall、ProxyOperationRuntime)操作) System.ServiceModel.Channels.ServiceChannelProxy.Invoke (IMessage メッセージ) で[0] で例外が再スローされました: System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) で) CreditCardServiceClient.TestAuth() で
内部例外: 基になる接続が閉じられました: 受信時に予期しないエラーが発生しました。System.Net.HttpWebRequest.GetResponse() で System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply (TimeSpan タイムアウト) で
内部例外: トランスポート接続からデータを読み取ることができません: 既存の接続がリモート ホストによって強制的に閉じられました。System.Net.Sockets.NetworkStream.Read (Byte[] バッファー、Int32 オフセット、Int32 サイズ) で System.Net.PooledStream.Read (Byte[] バッファー、Int32 オフセット、Int32 サイズ) で System.Net.Connection.SyncRead (HttpWebRequest リクエスト、ブール値の userRetrievedStream、ブール値の probeRead)
内部例外: System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) at System.Net.Sockets.NetworkStream.Read(Byte) で、既存の接続がリモート ホストによって強制的に閉じられました。 [] バッファ、Int32 オフセット、Int32 サイズ)