Javascript ServiceStack客户端序列化错误

时间:2017-02-16 00:54:32

标签: javascript servicestack aurelia

所以我在两个视图之间有一个主/细节场景。母版页显示一个列表,在单击其中一个项目后,我通过Aurelia中的EventAggregator向子视图发送一条消息,其中包含反序列化的dto(来自主服务器的所选项)作为消息的有效负载。 / p>

然而,当我尝试将此项作为子项中后续请求的参数传递时(为了获取其他信息),有效负载对象无法序列化。

Master.ts:

import { JsonServiceClient } from "servicestack-client";
import {
    ListPendingHoldingsFiles,
    ListPendingHoldingsFilesResponse,
    SendHoldings,
    PositionFileInfo
} from "../holdingsManager.dtos";
import { inject, singleton } from "aurelia-framework";
import { Router } from "aurelia-router";
import { EventAggregator } from "aurelia-event-aggregator";
import { GetPendingPositionMessage } from "../common/GetPendingPositionMessage";

@singleton()
@inject(Router, EventAggregator)
export class Pending {
    router: Router;
    positions: PositionFileInfo[];
    client: JsonServiceClient;
    eventAgg: EventAggregator;

    constructor(router, eventAggregator) {
        this.router = router;
        this.eventAgg = eventAggregator;
        this.client = new JsonServiceClient('/');
        var req = new ListPendingHoldingsFiles();
        this.client.get(req).then((getHoldingsResponse) => {
            this.positions = getHoldingsResponse.PositionFiles;
        }).catch(e => {
            console.log(e); // "oh, no!"
        });
    }

    openHoldings(positionInfo) {
        this.eventAgg.publish(new GetPendingPositionMessage(positionInfo));
        this.router.navigate('#/holdings');
    }
}

Child.ts:

import { JsonServiceClient } from "servicestack-client";
import { inject, singleton } from "aurelia-framework";
import { Router } from 'aurelia-router';
import { EventAggregator } from "aurelia-event-aggregator";
import { GetPendingPositionMessage } from "../common/GetPendingPositionMessage";
import {
    GetPendingHoldingsFile,
    GetPendingHoldingsFileResponse,
    Position,
    PositionFileInfo
} from "../holdingsManager.dtos";

@singleton()
@inject(Router, EventAggregator)
export class Holdings {
    router: Router;
    pendingPositionFileInfo: PositionFileInfo;
    position: Position;
    client: JsonServiceClient;
    eventAgg: EventAggregator;

    constructor(router, eventAggregator) {
        this.router = router;
        this.eventAgg = eventAggregator;
        this.eventAgg.subscribe(GetPendingPositionMessage,
            message => {
                this.pendingPositionFileInfo = message.fileInfo;
            });
    }

    activate(params, routeData) {
        this.client = new JsonServiceClient('/');
        var req = new GetPendingHoldingsFile();
        req.PositionToRetrieve = this.pendingPositionFileInfo;
        this.client.get(req).then((getHoldingsResponse) => {
            this.position = getHoldingsResponse.PendingPosition;
        }).catch(e => {
            console.log(e); // "oh, no!"
        });
    }
}

因此,当孩子激活并尝试发送请求'GetPendingHoldingsFile'时会发生错误。

Failed to load resource: the server responded with a status of 500 (NullReferenceException)

我已经验证了子中的this.pendingPositionFileInfo不为null或为空,而在服务器端,该对象未被接收(它为null)。我是Aurelia的新手,对Javascript没有太多经验,所以我必须遗漏一些东西,任何建议都会受到赞赏。

修改1

这与我与ServiceStack的交互方式似乎有些不对劲。我正在使用serviceStack的4.5.6版本和servicestack-client@^0.0.17。我尝试新建一个dto(PositionFileInfo)的新副本并复制父视图中的所有值,以确保没有一些我不知道的javascript类型转换怪异,但即使是新鲜的dto webservice仍然收到一个空请求。

1 个答案:

答案 0 :(得分:1)

切换来自' client.get(...)'到' client.post(...)'解决了这个问题。显然,尝试在URL中序列化对象并不是一个好计划。