【问题标题】:React Axios - C# WebAPI request token fails without a server errorReact Axios - C# WebAPI 请求令牌失败而没有服务器错误
【发布时间】:2018-06-07 06:10:51
【问题描述】:

我有以下代码:

var qs = require('qs');

const ROOT_URL = 'http://localhost:56765/';
const data = qs.stringify({ username, password, grant_type: 'password' });
axios.post(`${ROOT_URL}token`, data)
.then(response => {
    debugger;
    dispatch(authUser());
    localStorage.setItem('token', response.data.token);
})
.catch((error) => {
    debugger;
    dispatch(authError(error.response));
});

当我运行这段代码时,我点击了调试器,错误对象在 catch 块中有 Error: Network Error at createError (http://localhost:3000/static/js/bundle.js:2188:15) at XMLHttpRequest.handleError (http://localhost:3000/static/js/bundle.js:1724:14)。但是,在 Chrome 的网络选项卡中,状态代码为 200,但是当我单击此请求的响应/预览选项卡时,没有数据。如果我点击继续,我实际上会按预期在响应/预览选项卡中获取令牌和其他数据,但此时它已经到达了 catch 块,因此不会命中 then 块。

我什至调试了后端并且它没有发回错误,所以我认为这是一个前端错误。有谁知道是什么原因造成的?

编辑:

只是为了添加更多详细信息,如果我将请求更改为使用 fetch 而不是 axios,我会收到另一个错误 TypeError: Failed to fetch。用于调用的代码是:

fetch(`${ROOT_URL}token`, {
    method: 'POST',
    body: data
})

此外,这是邮递员请求正常工作的示例:

【问题讨论】:

  • 你使用static服务器吗?错误 URL 'http://localhost:3000/static/js' 与您的操作 URL 'http://localhost:56765/token' 不同。这只是假设,所以我可能错了
  • 什么是静态服务器?我的服务器是默认的 C# WebAPI
  • 我认为这与github issue about an axios bug有关,也许您可​​以尝试一些解决方法。
  • @Dyo 只花了几个小时尝试上述线程中的所有内容。他们都没有工作;我仍然遇到同样的错误。感谢您尝试
  • 由于这似乎是 web api 令牌请求,您应该启用 https。当 https 被禁用时,你会得到一个静默失败,邮递员没有响应。

标签: c# reactjs asp.net-web-api fetch axios


【解决方案1】:

它应该通过添加内容类型与 fetch 一起使用:

fetch(`${ROOT_URL}token`, {
    method: 'POST',
    headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'},
    body: data
})

你也可以在 axios 中尝试这个,但它似乎与 axios bug 相关,你可以通过添加 params 属性来尝试:

axios.post(`${ROOT_URL}token`, data, params: data)

【讨论】:

  • 获取也有同样的问题,axios 帖子有一个错误expected 1-3 arguments, but got 4,这很奇怪,因为只有 3 个。但是当我以 axios.post(${ROOT_URL}token@987654327 进行时@我得到了通常的错误。感谢您的尝试
  • 这个怎么样:axios.post(`${ROOT_URL}token`, data: {}, params: data)
  • 当我这样做时它认为有 5 个参数......我认为你不能在调用方法时定义名称,它会按照定义的顺序查找参数,所以冒号在那里没用。
【解决方案2】:

终于找到我的答案了。事实证明,我没有在我的 WebAPI 后端为 /token 端点启用 CORS。我能够解决此问题的方法是通过在名为GrantResourceOwnerCredentials 的方法的顶部添加行context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); 来启用MyProject\Providers\ApplicationOAuthProvider.cs 中的CORS。我确实认为有更好的方法可以为整个项目启用 CORS,我将在接下来研究这些方法!

从这里获得有关如何启用 CORS 的帮助:Enable CORS for Web Api 2 and OWIN token authentication

【讨论】:

  • 我将这个添加到 WebApiConfig.cs: // 使用 NuGet 添加这个:nuget.org/packages/Microsoft.AspNet.WebApi.Cors config.EnableCors();
  • 是的,澄清一下,我发现您可以通过 var cors = new EnableCorsAttribute( origins: "*", headers: "*", methods: "*"); config.EnableCors(cors);WebApiConfig.cs 中全局启用 CORS,但您仍然需要在 ApplicationOAuthProvider.cs 中为令牌请求启用 CORS
猜你喜欢
  • 2017-08-12
  • 2018-06-06
  • 1970-01-01
  • 2017-03-04
  • 2019-02-25
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 2021-01-12
相关资源
最近更新 更多