ASP.NET Web API 部署到测试服务器时 POST 请求上的“400 错误请求”

ASP.NET Web API "400 Bad Request" on POST Request When Deploying to Test Server

我有一个单页应用程序 (SPA),其中 AngularJS 作为我的 front-end 和 .NET Web API 作为我的后端。在我的开发机器上一切正常,即当我从本地主机下的 Visual Studio (2015) 运行 它时。然而,一旦发布到我们的测试服务器,当发送 POST 请求到 Web API 时,我收到“400 Bad Request”错误。 GET 请求工作正常。我正在使用 Fiddler 调试它,当我查看 TextView 选项卡时,它显示 "The underlying provider failed to Open"。以下是 Fiddler 的一些屏幕截图:

请求和响应在我的本地机器上是这样的:

这是测试服务器上的响应 header:

以及测试服务器上的 TextView:

通过 POST 请求发送的数据对于本地主机和测试服务器都是相同的。此外,对于他们两个,都存在授权 header。除了 "Referer" 和 "Host" 的值外,我注意到它们之间唯一的区别是当测试服务器打开时,localhost 在 IIS/10.0 上 运行ning IIS/8.0.

调用WebAPI的AngularJS资源代码如下:

(function () {
"use strict";

angular
    .module("mainApp")
    .factory("incidentResource", ["$resource", "baseApiUrl", incidentResource]);

/// The factory function. The Angular $resource service and the appSettings
/// constant are injected as parameters.
function incidentResource($resource, baseApiUrl) {

    return {

        generateFile: $resource(baseApiUrl + "/api/Imports/PreviewOverlay", null,
        {
            'generate': { method: 'POST' }
        })

    };
}

})();

这是从 Angular 代码中调用的,如下所示:

vm.generate = function () {
        incidentResource.generateFile.generate(vm.divisionImports,
            function (data) {
                vm.successMessage.show = true;
            },

            function (response) {
                vm.message = response.statusText + "\r\n";
                if (response.data.exceptionMessage) {
                  vm.message += response.data.exceptionMessage;
                }
            });
    }

最后,我的 Web API 控制器如下所示:

[RoutePrefix("api/Imports")]
public class ImportController : BaseController
{
    [Authorize]
    [HttpPost]
    [Route("PreviewOverlay")]
    public IHttpActionResult GenerateFile(DivisionImport[] chargedIncidents)
    {
        try
        {
            // Get the name of the user currently logged in
            string UserName = this.GetCurrentUserIdFromRequest();

            List<DivisionImport> incidentsList = new List<DivisionImport>();

            incidentsList.AddRange(chargedIncidents);

            this.incidentFileBuilder.GenerateFile(FileType.Delimited, incidentsList);

            return this.Ok();
        }
        catch (Exception ex)
        {
            return this.BadRequest(ex.Message);
        }
    }
}

[EnableCors(origins: "*", headers: "*", methods: "*")]
public class BaseController : ApiController
{
}

什么可能导致此错误?

正如@Dan Jul 指出的那样,错误是由错误的数据库连接字符串引起的。在将我的代码部署到我们的测试服务器时,我们将连接配置文件更改为另一个文件(用于测试服务器),它包含一个语法错误的连接字符串。

一切正常。