问题标签 [servicestack-text]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
servicestack - HttpResult 上的 ToOptimizedResult 导致 StackOverflow 异常
我正在使用 v3.9.56.0 并且在ToOptimizedResult
从服务返回时调用(从我自己的服务运行程序调用)时遇到堆栈溢出异常HttpResult
。当我深入挖掘时,我发现异常来自JsonSerializer
.
以下是返回内容的代码片段:
c# - ServiceStack 的 JSON 反序列化器解析无效的 JSON
鉴于 JSON 文本无效,{ "foo" = "bar" }
ServiceStack 内置的 JSON 反序列化器将成功将其解码为以下 DTO:
现在,也许这对于某些用例来说是可以接受的,因为它看起来有点像 C# 初始化程序,所以实际上可能不解析 JSON 是这个库的一个特性。
但是,当给定无效的 JSON 文本时{ "foo" xxx "bar" }
,不会引发任何错误,而且可怕的是 Foo 属性设置为“xxx”。
有没有办法(a)将 ServiceStack.Text 配置为仅解析 JSON(而不是默认情况下接受的任何非标准变体)或(b)在应用程序级别用 JSON.NET 替换序列化程序?
编辑:看起来 ServiceStack 的 Web 路由代码的反序列化行为与在无效解析ServiceState.Text.JsonSerializer
时返回的行为不同。default(T)
编辑2(进度?):
设置此选项将导致 ServiceStack 在格式错误的 JSON 上返回 400 Bad Request,但遗憾的是无法将 JSON 反序列化为给定的 DTO。也许这是解决方案的一部分?
解决方案:
用自定义的“application/json”处理程序替换 ServiceStack 的默认 JSON 序列化程序,该处理程序反过来包装 JSON.NET 序列化程序最终解决了问题。我在下面的答案中包含了解决方案代码的副本。我希望它有所帮助。
c# - When using servicestack deserializationToString to a DTO array, a null object is at the end of the list
I am coding in C# on Visual Studio 2013 and I'm trying to deserialize some JSON using ServiceStack 3.9.71. They are contained in files (not under my control) and when I try to deserialize it, I end up with the correct array of DTO's but in addition, I have a null object at the end of the array. I've narrowed it to a carriage return ("\r") at the end of the file. A few solutions I can do is to trim the string, or remove all the "\r", or disable CRLF auto switch in GIT and just be super diligent when committing, however, I feel that seems like a "hack". I feel that DeserializeFromString should be able to handle carriage returns at the end of the string. On the brighter side, when I'm run the same code on OSX, it works perfectly fine since the file is now in Unix format that only uses linefeeds and not a combination of carriage returns and line feeds.
Has anyone else seen this? Any recommended fixes besides the ones I've mentioned?
To prove it to myself, I wrote a simple test (fails both Windows and OSX).
My DTO:
My Test:
The results:
c# - 如何从 ServiceStack 中的自定义序列化程序访问 IHttpRequest
我们的模型有自定义序列化程序,可以根据请求路径保护敏感数据。(例如,如果请求不以“/admin”开头)。
到目前为止,我们已经尝试在带有 ReuseScope.None 或 ReuseScope.Request 的 RequestFilter 上使用 Funq 容器注册 IHttpRequest,在序列化程序上,我们从容器中获取 IHttpRequest。
我们发现,如果有多个请求未决,容器将返回最后注册的 IHttpRequest,它并不总是正确的请求对象。
我知道我们可以尝试在应用过滤器属性的模型上实现对敏感数据的保护,但这非常麻烦,因为我们的模型对象通常嵌入到其他对象或集合中。
如果不是因为无法从序列化器中获取正确的 HttpRequest 对象的问题,让序列化器来做这件事对我们来说是迄今为止最好的解决方案。
那么,这样做的正确方法是什么?或者这是一个不好的做法?
这里有一些代码示例:
所以这是一个私有方法,我的序列化程序使用它来定义它们是否在“管理员”路由中被序列化:
这是它的用法:
在我的 AppHost 初始化中,我有:
注意:我使用的是 ServiceStack v3。
c# - ServiceStack.Text.EnumMemberSerializer 不适用于 Swagger 插件
我正在使用 ServiceStack v 3.9.71 和ServiceStack.Text.EnumMemberSerializer
程序集将枚举序列化为可读文本。
这很好用,我的枚举值被序列化为我使用EnumMemberAttribute
.
不过,问题是 Swagger 不使用我的名字。我的猜测是它只是调用.ToString()
枚举值而不是EnumMemberAttribute
值的方法。
这是我设置序列化的顺序。(在 AppHost 中):
在添加 swagger 功能之前或之后设置枚举序列化程序似乎并不重要。
asp.net - 在 WCF 中使用 Servicestack.Text 4.0.18 进行部署
![在此处输入图像描述][1]我已经构建了一个 WCF 类库项目,其中我使用了 ServiceStack.Text 程序集版本 4.0.18 。
我的全部想法都是针对 .NET 4.0 构建的。
该项目在调试时工作正常,使用 ASP.NET 自托管。但是我已经制作了另一个包含此类库的 WCF 服务应用程序,并且我想在 IIS 上部署 WCF 应用程序,我已经部署在 IIS 上,但出现以下错误:
说明:处理服务此请求所需的配置文件期间发生错误。请查看下面的具体错误详细信息并适当地修改您的配置文件。
解析器错误消息:无法加载文件或程序集“AdCarWebService”或其依赖项之一。此程序集由比当前加载的运行时更新的运行时构建,无法加载。
源错误:
servicestack - 使用空(非空)请求对象使 JsonServiceClient 处理请求
如何配置 ServiceStack v3.xJsonServiceClient
以序列化空请求对象并调用服务?
我想得到一个例外,而是JsonServiceClient
返回null
。我在服务的顶部放了一个断点,它从来没有命中。但是当 name 属性不为空时,它会被命中。
结果消息:
这是失败的测试,它不会引发任何前任。
直接调用服务的等效测试通过。
DTO:
正如 Doug 指出的那样,这就解释了这一点。它无法创建没有名称值的有效路由。太糟糕了,当它无法创建有效路线时,它不会引发异常。返回null
并不表明问题的根源。
c# - 是否可以为 ServiceStack.Text 中的开放泛型类型设置自定义(反)序列化程序?
我有这样的类型:
ToJson
以Foo<Bar>
一种无法通过调整JsConfig
. 此外,ToJson
依赖 ServiceStack.Text 来序列化Nested
,它可以是Foo<Baz>
.
不幸的是,JsConfig
实现方式意味着将有一JsConfig<T>
组静态变量 forFoo<Bar>
和其他 for Foo<Baz>
。此外,AFAIK,ServiceStack.Text 无法为开放的泛型类型(即:类似的东西JsConfig.Add(typeof(Foo<>), config)
)配置 JSON 序列化。我试图通过创建这个静态构造函数来解决这个问题Foo<T>
:
这并不总是有效。这取决于运行时调用静态构造函数的顺序。显然,ServiceStack.Text 缓存了序列化程序函数,并且有时会在调用静态构造函数之前执行此操作,具体取决于 API 中调用操作的顺序,因此:
我不能JsConfig<Foo<T>>
预先设置所有的序列化器,因为 T 几乎可以是任何类型,甚至是其他泛型类型。
是否可以在 ServiceStack.Text 中为开放的泛型类型(可以嵌套)定义自定义序列化例程?
json - ServiceStack.Text:使用 Linq 和 ConvertAll
我正在使用 ServiceStack.Text JsonObject 解析器映射到我的域模型。我基本上可以正常工作,除非使用 Linq 过滤 ArrayObject 并尝试使用 convertAll 对其进行转换。Iam 在使用链接后无法实际出现,将逐个元素添加到 JsonArrayObjects 列表然后传递它。
问题:有没有更优雅的方式从 IEnumarable 返回到 JsonArrayObjects?转换不起作用,因为 where 将元素复制到列表中,而不是操作旧的,因此结果不是向下转换的 JsonArrayObjects,而是一个新的 List 对象。
最好的
c# - 反序列化时ServiceStack JsonServiceClient静默失败
我正在与 Expedia API 集成。我对 ServiceStack 相对较新,但到目前为止管理得很好,但是,我遇到了一个问题,即来自 API 的 JSON 响应的反序列化,尽管已JsConfig.ThrowOnDeserializationError
启用,但似乎还是失败了。
为了查看我正在使用的 API 响应,请使用以下请求:
这是一个典型的回应:
除了我真正感兴趣的所有速率信息外,大部分响应都可以很好地反序列化。在反序列化过程中没有抛出异常,因此我在追踪确切问题方面几乎没有什么可做的。更具体地说,让我们以 ChargeableRateInfo 为例——其中包含的所有值要么为空,要么为零。
这是我试图反序列化响应的课程:
这可能与 JSON 中的 @ 符号有关吗?如果是,我该如何解决?