【发布时间】:2016-02-14 09:34:56
【问题描述】:
我在 ASP.NET 4 中使用 C# 的 Web API 遇到了一个小问题。我正在尝试创建一个前端 GUI,它通过多个 Web API 发送和接收数据。拥有多个 API 的原因与我们的网络有关,该网络由多个安全区域组成。服务器位于不同的区域,一个简单的请求可能需要通过多达 3 个不同的 API。
具体来说,我将一个 JSON 对象从 GUI 发送到第一个 API。 JSON 对象应该被转发到下一个 API 和下一个 - 并且从那里创建一个新的 JSON 对象并沿相同的路径返回。
路径本身运行良好。问题是 JSON 对象一旦返回 GUI 就无法解析。我收到一个用引号括起来的 JSON 字符串,每个 API 一次。
字符串的开头可能是这样的:
Hey! I am a string, or a JSON object of sorts!
API 之间的第一跳给了我这个:
"Hey! I am a string, or a JSON object of sorts!"
下一跳之后是这样的:
"\"Hey! I am a string, or a JSON object of sorts!\""
当我的 GUI 掌握它时,我们已经有了这样的东西:
"\"\\\"Hey! I am a string, or a JSON object of sorts!\\\"\""
这是解析失败的地方,原因很明显。 JSON 对象本身格式正确,但所有引号都导致 JSON.net 解析器出现问题(对象内的所有引号也被多次包装)。
到目前为止,我尝试将请求作为 application/json 类型和 text/plain 类型发送。两者都做了同样的事情。 API 返回一个 HttpResponseMessage,使用 ReadAsStringAsync() 读取。我还尝试避免读取字符串,直接从 HttpRequestMessage 读取到 HttpResponseMessage 并仅在 GUI 中执行 ReadAsStringAsync(),但问题仍然存在。 JSON 字符串是使用 JSON.nets Serialize() 方法创建的,并使用 StringContent() 放入 HttpContent。这似乎正确地完成了这项工作。我相信引号是在 API 和 GUI 收到 HttpResponseMessage 时生成的。
知道如何将 JSON 字符串作为原始字符串发送和接收,不以任何方式处理吗?
我可以通过在每个 API 上将对象解析为 JToken 或 JObject 并再次对其进行序列化来绕过此行为。然而,这不是一个好的解决方案——我宁愿 API 只是按照他们得到的方式转发消息,而不是对它做任何事情。我使用路由研究了转发,但是有很多授权的东西,这确实需要我使用 API 操作,而不是重定向路由。
澄清 (TLDR):理想的解决方案是让 API 简单地传递消息而不解析或读取任何内容。只要消息的来源被授权,请求被加密并且请求的 URL 是有效的,消息本身对每个“代理”API 并不重要。
【问题讨论】:
-
您能否提供一个代码示例来演示您的问题的Minimal, Complete, and Verifiable example?如果我搜索“asp.net json double serialize”,我会找到 WCF RESTful web service with JSON.Net: avoid double serialization 和 JSON.NET Parser seems to be double serializing my objects 以及 ASP.NET web services mistake: manual JSON serialization。
标签: c# json api asp.net-web-api