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 指出的那样,错误是由错误的数据库连接字符串引起的。在将我的代码部署到我们的测试服务器时,我们将连接配置文件更改为另一个文件(用于测试服务器),它包含一个语法错误的连接字符串。
一切正常。
我有一个单页应用程序 (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 指出的那样,错误是由错误的数据库连接字符串引起的。在将我的代码部署到我们的测试服务器时,我们将连接配置文件更改为另一个文件(用于测试服务器),它包含一个语法错误的连接字符串。
一切正常。