400 仅在启用 cors 时响应 asp.net web api POST 请求

Posted

技术标签:

【中文标题】400 仅在启用 cors 时响应 asp.net web api POST 请求【英文标题】:400 Response for asp.net web api POST request only when cors is enabled 【发布时间】:2018-07-20 13:47:35 【问题描述】:

我已经被这个问题难住了好几天了。我是 CORS 的初学者,所以在导航过程中非常混乱。

出了什么问题: 我创建了一个 asp.net web api,它可以成功地将 POST 请求发送到我的 SQL 数据库。我已经使用 POSTMAN 成功发送数据。启用 CORS 后,我将无法再发送数据。我收到 400 错误请求。

我的代码的一些参考:

处理 POST 请求的我的控制器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using ClientsDataAccess;

namespace MS_Clients_Post.Controllers

    public class ClientsController : ApiController
    
        public HttpResponseMessage Post([FromBody] Client client)
        
            try
            
                using (NewlandiaEntities entities = new NewlandiaEntities())
                
                    entities.Clients.Add(client);
                    entities.SaveChanges();

                    var message = Request.CreateResponse(HttpStatusCode.Created, client);
                    message.Headers.Location = new Uri(Request.RequestUri +
                        client.Id.ToString());

                    return message;
                
            
            catch (Exception ex)
            
                return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
            
        

    

我的 webAPIconfig.cs 文件(我在其中启用了 CORS):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Web.Http.Cors;

namespace MS_Clients_Post

    public static class WebApiConfig
    
        public static void Register(HttpConfiguration config)
        
            // Web API configuration and services

            //enabling cors.  The "*","*","*" attributes allow all to access.  This should be more limited acccess in the future.
            var cors = new EnableCorsAttribute("*", "*", "*");
            config.EnableCors(cors);
            //end of cors code.

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/controller/id",
                defaults: new  id = RouteParameter.Optional 
            );
        
    

我在 Fiddler 中看到的内容: OPTIONS Response 200 (Only returned with Angular APP, not POSTMAN

还有POST Response 400 BAD REQUEST (With POSTMAN or Angular APP

TLDR; 使用 ASP.net Web API 的 POST 请求在启用 CORS 之前有效。为什么之后就不行了?

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

我找到了解决问题的方法。这是未能确定实际出了什么问题。结合不同的事物:

当我的应用程序由 VSTS 部署到我的开发网络服务器时,它从 IIS 应用程序中删除了 SQL 服务器登录凭据。 (IIS 应用程序池的高级设置)。

其次,更重要的是,我的 Angular 应用程序的语法确实不正确。因此,Angular 应用程序的语法是错误的,但 POSTMAN 是正确的(在邮递员中,我将使用 GET 方法从服务器获取 JSON,然后复制粘贴 JSON 以执行 POST 请求)。

经验教训,如果显示 400 Bad Syntax,请仔细检查您发送的内容的语法!

【讨论】:

以上是关于400 仅在启用 cors 时响应 asp.net web api POST 请求的主要内容,如果未能解决你的问题,请参考以下文章

无法在 ASP.Net Core Web api 中启用 CORS

尝试在 ASP.Net MVC 网站中启用 CORS 时出错

启用 Cors 的 ASP.NET Core API 不起作用

带有反应应用程序的 POST 上的 ASP.NET CORS 异常

仅在文件上传中出现 Asp.Net Core API CORS 策略错误

Access-Control-Allow-Origin header not found 错误,当在 ASP.NET Web api 身份中启用 cors 时