babalae/better-genshin-impact · warning · ArgumentException

激活请求缺少命令行参数。

Error message

激活请求缺少命令行参数。

What it means

Thrown by HandleActivationDispatch when request.Data is null or cannot be deserialized to ActivationDispatchRequest. The activation dispatch carries command-line arguments to be replayed in the target instance; a null Data or deserialization failure means the request is structurally incomplete. This is an ArgumentException (caller-side contract), not InvalidDataException (wire-level).

Source

Thrown at BetterGenshinImpact/Service/Instance/MessageHandlers/InstanceRequestHandler.cs:123

    /// </summary>
    private InstanceIpcEnvelope HandleActivationDispatch(
        InstanceConnection connection,
        InstanceIpcEnvelope request)
    {
        if (_context.InstanceType == BetterGiInstanceType.Primary
            || connection.RemoteEndpoint?.InstanceType != BetterGiInstanceType.Primary)
        {
            throw new InvalidOperationException("只有根实例可以向 BetterGI 客户端分发激活消息。");
        }

        if (_activationResponses.TryGetValue(request.RequestId, out var cachedResponse))
        {
            return cachedResponse;
        }

        var activation =
            request.Data?.ToObject<ActivationDispatchRequest>(InstanceIpcProtocol.Serializer)
            ?? throw new ArgumentException("激活请求缺少命令行参数。");
        _enqueueActivation(activation.Arguments);
        return CacheActivationResponse(
            request.RequestId,
            InstanceIpcEnvelope.Response(request));
    }

    /// <summary>
    /// 校验子实例身份和启动记录后,将当前连接登记为有效子连接。
    /// v2 不再校验父实例 ID 或启动记录,而是使用根管道客户端的真实 PID 和 Session。
    /// </summary>
    private async Task<InstanceIpcEnvelope> HandleConnectionOpenAsync(
        InstanceConnection connection,
        InstanceIpcEnvelope request,
        CancellationToken cancellationToken)
    {
        if (_context.InstanceType != BetterGiInstanceType.Primary)
        {
            throw new InvalidOperationException("只有根实例可以接受客户端连接登记。");

View on GitHub (pinned to a7cb36712d)

Solutions

  1. Verify the root-side dispatch construction in HandleConnectionOpenAsync: new ActivationDispatchRequest { Arguments = open.Arguments } — ensure open.Arguments is not null.
  2. Ensure ConnectionOpenRequest.Arguments defaults to [] (empty array) as defined, so it is never null.
  3. Check for version match between peers so ActivationDispatchRequest schema is consistent.
  4. If handling programmatically, validate request.Data is not null before calling HandleActivationDispatch.
Defensive patterns

Strategy: validation

Validate before calling

// Before sending activation.dispatch, ensure Arguments is non-null
var dispatchData = new ActivationDispatchRequest
{
    Arguments = open.Arguments ?? []
};
var request = InstanceIpcEnvelope.Request(InstanceOperations.ActivationDispatch, dispatchData);

Prevention

When it happens

Trigger: The root sends an activation.dispatch request whose Data JObject is null (was not set) or whose JSON does not map to ActivationDispatchRequest (missing Arguments field, wrong type). Since InstanceIpcEnvelope.Request serializes data via JObject.FromObject, a null data parameter at construction would produce a null Data field.

Common situations: The root's HandleConnectionOpenAsync builds ActivationDispatchRequest but passes null or empty Arguments; a version mismatch where ActivationDispatchRequest.Arguments was renamed or removed; a bug in the forwarding code that constructs the dispatch without data; test code that hand-builds an envelope without Data.

Related errors


AI-assisted analysis of babalae/better-genshin-impact@a7cb36712d (2026-08-13). Data as JSON: /api/errors/fb82da1208bf94d4. Report an issue: GitHub.