小编kiw*_*hen的帖子

通过Web API发送的字符串包含在引号中

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

具体来说,我正在从GUI向第一个API发送一个JSON对象.应该将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都无关紧要.

c# api json asp.net-web-api

31
推荐指数
5
解决办法
3万
查看次数

针对具有 IdentityServer3 授权的 MVC 控制器的 Ajax 请求中的 CORS

我目前正在使用各种 Ajax 请求来保存、加载和自动完成数据的站点上工作。它是使用 C#、MVC 和 JQuery 构建的。MVC 控制器上的所有操作都需要用户获得授权,我们使用 IdentityServer3 进行身份验证。它是使用 NuGet 安装的,当前版本为 2.3.0。

当我打开页面并按下按钮时,一切正常。当某个会话过期时,似乎会出现该问题。如果我闲置一段时间并尝试使用 Ajax 函数,则会生成以下错误:

XMLHttpRequest 无法加载https://identityserver.domain.com/connect/authorize?client_id=Bar&redirect_uri=http%3a%2f%2flocalhost%3a12345&response_mode=form_post&response_type=id_token+token&scope=openid+profile+email+phone+roles [... ]。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问Origin ' http://localhost:12345 '。

根据我对 Ajax 的了解,问题本身非常简单。MVC 站点已丢失对当前会话的跟踪,并要求客户端再次进行身份验证。我从 Ajax 请求中得到的响应是“302 Found”,带有指向我们的 IdentityServer 的位置标头。IdentityServer 恰好在另一个域中,虽然这在您执行常规 HTTP 请求时可以正常工作,但对于 Ajax 请求却不是特别好。“同源策略”直接阻止了 Ajax 功能的身份验证。如果我刷新页面,我将被重定向到 IdentityServer 并正常进行身份验证。然后事情会在几分钟内恢复正常。

解决方案可能是在来自 IdentityServer 的响应消息中添加一个额外的标头,明确指出该服务允许跨域请求。

我目前没有从 IdentityServer 获得这个标头(在 Fiddler 中检查)。

根据 docs,它应该默认启用。我已经检查过我们确实以这种方式启用了 CORS:

factory.CorsPolicyService = new Registration<ICorsPolicyService>(new DefaultCorsPolicyService { AllowAll = true });
Run Code Online (Sandbox Code Playgroud)

这是我的一位客户:

new Client
{
    Enabled = true,
    ClientName = "Foo",
    ClientId = "Bar",
    ClientSecrets …
Run Code Online (Sandbox Code Playgroud)

ajax cors identityserver3

5
推荐指数
1
解决办法
4423
查看次数

标签 统计

ajax ×1

api ×1

asp.net-web-api ×1

c# ×1

cors ×1

identityserver3 ×1

json ×1