ターンベースの Web ゲームでメインのビジネス ロジックを処理する WCF サービスを作成しましたが、WcfTestClient でのテスト中に問題が発生しました。WCF を介して公開しているメソッドのシグネチャからわかるように、いくつかのオプションのパラメーターがあります。
public PlayerActionResult DoAction(PlayerActionType type, int uid, string pparam = null, int amount = 0, string svalue = null);
したがって、アクションのタイプは、アクションを実行するプレーヤーのユーザー ID (uid) と同様に、間違いなく要件です。その後、特定のアクションは別のプレーヤー、整数の量、または一般的な文字列値を必要とする場合と必要としない場合があるため、パラメーターはオプションになります。 (つまり、別のプレイヤーを攻撃するには、キャラクターの名前 [pparam] を使用して検索される別の Player オブジェクトが必要です)。DoAction メソッドの実装全体を次に示します。
public PlayerActionResult DoAction(PlayerActionType type, int uid, string pparam = null, int amount = 0, string svalue = null)
{
Player playerparam;
Player player;
// Verify players exist
if (!PlayerExists(uid))
{
return new PlayerActionResult(false, ResultType.NotFound);
}
else { player = GetPlayer(uid); }
if (pparam != null & !PlayerExists(pparam))
{
return new PlayerActionResult(false, ResultType.NotFound);
}
else { playerparam = GetPlayer(pparam); }
// Construct action and pass parameters
return player.DoAction(new PlayerAction(type, playerparam, amount, svalue));
}
その方法を考慮して、いくつかのテストを実行して、これがほとんどの場合意図したとおりに機能することを確認することにしました. WcfTestClient を介してメソッドに (null) を渡そうとすると、次のエラーが表示されるまで、すべてが機能します。
シーケンスには要素が含まれていません
サーバー スタック トレース: System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood (メッセージ応答、>MessageFault フォールト、文字列アクション、MessageVersion バージョン、FaultConverter faultConverter) System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime >operation、ProxyRpc& rpc) at System System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage >methodCall、ProxyOperationRuntime 操作) での .ServiceModel.Channels.ServiceChannel.Call(文字列アクション、Boolean oneway、>ProxyOperationRuntime 操作、Object[] ins、Object[] outs、TimeSpan タイムアウト) System.ServiceModel.Channels.ServiceChannelProxy.Invoke (IMessage メッセージ) で
[0] で再スローされた例外:
System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage で (IMessage reqMsg、>IMessage retMsg)
System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData& msgData、Int32 型) で
IConquestService.DoAction (PlayerActionType 型、Int32 uid、文字列 pparam、Int32 量、文字列 svalue) で
ConquestServiceClient.DoAction (PlayerActionType 型、Int32 uid、文字列 pparam、Int32 量、文字列 svalue) で
私はしばらくこの苦境に悩まされ、「シーケンスには要素が含まれていません」というキーワードを何度か検索しましたが、この特定の問題には役に立ちませんでした。ただし、MVC アプリからこのメソッドを呼び出すと、すべてが非常にスムーズに機能し、アクション ロジックが呼び出されて問題なく処理されることに注意してください。WcfTestClient内でpparamとして(null)を渡そうとしたときだけのようです。誰かがこれにつまずいて、私を啓発することができれば、私はそれを大いに感謝します.
更新しました:
その提案をありがとう!これを投稿してから15分以内にいじっていましたが、いくつかの変更を加えて問題を修正しました. オプションのパラメーターはそのままにして、代わりに PlayerAction オブジェクトを最初にインスタンス化し、pparam 文字列が存在する場合はそのオブジェクトの playerparam プロパティをメソッド内で直接設定することで、メソッドを少し改良しました。現在の外観は次のとおりです。
public PlayerActionResult DoAction(PlayerActionType type, int uid, string pparam = null, int amount = 0, string svalue = null)
{
Player player;
PlayerAction action = new PlayerAction();
action.type = type;
// Verify executor exists
if (!PlayerExists(uid))
{
return new PlayerActionResult(false, ResultType.NotFound);
}
else { player = GetPlayer(uid); }
if (pparam != null & !PlayerExists(pparam))
{
if (!PlayerExists(pparam))
{
return new PlayerActionResult(false, ResultType.NotFound);
}
action.playerparam = GetPlayer(pparam);
}
// Construct action and pass parameters
return player.DoAction(new PlayerAction(type, amount, svalue));
}