一尘不染

通过Web API发送的字符串用引号引起来

json

我在使用C#的ASP.NET 4中遇到了我的Web API的小问题。我正在尝试创建一个前端GUI,该GUI通过多个Web
API发送和接收数据。拥有多个API的原因与我们的网络有关,该网络由几个安全区域组成。服务器位于不同的区域,一个简单的请求可能必须传递多达3个不同的API。

具体来说,我是从GUI向第一个API发送JSON对象。应该将JSON对象转发到下一个API和下一个API,然后从那里创建一个新的JSON对象,并沿着相同的路径返回。

路径本身工作正常。问题在于,一旦返回到GUI,就无法解析JSON对象。我收到一个用引号引起来的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解析器出现问题(对象内的所有引号也被多次包装)。

到目前为止,我尝试将请求发送为应用程序/
json类型和文本/纯文本类型。两者都做同样的事情。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都没有太大关系。


阅读 280

收藏
2020-07-27

共1个答案

一尘不染

经过大量研究后,我终于弄清楚了这一点。

首先 我直接返回了HttpResponseMessage。我并不是故意沿API路径在每个跃点内反序列化它。

事实证明,问题实际上是我们在混合使用“本机”
MVC序列化方法和JSON.net的方法。单独使用任何一种都可以,并且可以提供所有API的清晰传递。但是,如果将原始方法和JSON.net方法中的序列化数据组合在一起,则API的下游将无法识别格式,并错误地假定应该再次序列化内容(使用原始方法)。

因此,解决方案只是从序列化过程中删除所有JSON.net方法,我们最终获得了预期的结果。

2020-07-27