WcfTestClient - 序列不包含任何元素 [当值为空时]

本文关键字:元素 包含任 何元素 WcfTestClient | 更新日期: 2023-09-27 18:31:21

我已经编写了一个WCF服务来处理基于回合的Web游戏的主要业务逻辑,但是在使用WcfTestClient进行测试时遇到了问题。从我通过 WCF 公开的方法的签名中可以看出,它有几个可选参数。

public PlayerActionResult DoAction(PlayerActionType type, int uid, string pparam = null, int amount = 0, string svalue = null);

因此,操作类型以及执行操作的玩家的用户 ID (uid) 绝对是必需的,之后参数变为可选,因为某些操作可能需要也可能不需要另一个玩家、整数量或一般字符串值(即攻击另一个玩家需要另一个 Player 对象,该对象使用字符的名称 [pparam]) 进行查找)。以下是 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) 传递 (null) 到该方法,此时我收到以下错误:

序列不包含任何元素

服务器堆栈跟踪: System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstand(Message reply,>MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter) at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime>operation, ProxyRpc& rpc) at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway,>ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage>methodCall, ProxyOperationRuntime operation) at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

在 [0] 处重新引发异常:

at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,>IMessage retMsg)

at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)

at IConquestService.DoAction(PlayerActionType type, Int32 uid, String pparam, Int32 amount, String svalue)

at ConquestServiceClient.DoAction(PlayerActionType type, Int32 uid, String pparam, Int32 amount, String svalue)

我已经在这个困境上炖了一段时间,并对"序列不包含任何元素"关键字进行了几次搜索,但对这个特定问题无济于事。但请记住,当我从我的 MVC 应用程序调用此方法时,一切运行都非常顺利,调用和处理操作逻辑没有问题。似乎只有当我尝试在 WcfTestClient 中作为 pparam 传递(null)时。如果有人偶然发现这一点并可以启发我,我将不胜感激。

更新:

感谢您的建议!我在发布此内容的 15 分钟内摆弄它,并进行了一些修改,最终解决了问题。我保留了可选参数,并通过首先实例化 PlayerAction 对象,然后在方法中直接设置该对象的 playerparam 属性(如果存在 pparam 字符串)来稍微重新调整方法。这是它现在的样子:

   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));
    }

WcfTestClient - 序列不包含任何元素 [当值为空时]

您是否尝试过将这些实现为重载而不是可选参数?

例如:

public PlayerActionResult DoAction(PlayerActionType type, int uid);
public PlayerActionResult DoAction(PlayerActionType type, int uid, string pparam);
public PlayerActionResult DoAction(PlayerActionType type, int uid, string pparam, int  amount);
//etc...

Windows Communication Foundation 可能不理解所分配的默认参数,只是将 OperationContract 作为 WSDL 中具有两个参数的方法进行传输。

这可以解释为什么它在 MVC 中工作,因为 WCF 需要在 SOAP 信封中传输的信息才能正确决定在服务器上执行的方法,而 MVC 使用正在访问的路由。