AngularJS 与 Asp.net Web API:$http post 返回 XMLHttpRequest 无法加载:预检响应具有无效的 HTTP 状态代

编程代码AngularJSXML

1个回答

写回答

龙仔xxx

2025-07-06 20:06

+ 关注

AngularJS
AngularJS

使用AngularJS与Asp.net Web API进行HTTP POST请求时,有时可能会遇到一个错误,即XMLHttpRequest无法加载的问题,错误信息显示为“预检响应具有无效的HTTP状态代码405”。这个错误通常意味着服务器不允许客户端发起的请求。

在本文中,我们将探讨这个问题的原因,并提供一个案例代码来演示如何解决这个错误。

## 问题起因

当我们使用AngularJS中的$http服务向Asp.net Web API发送POST请求时,浏览器会首先发送一个OPTIONS请求,以确定服务器是否允许跨域请求。这个被称为预检请求(preflight request)的OPTIONS请求包含一些头部信息,例如请求方法、请求头部和请求体等。

服务器在收到预检请求后,会检查请求头部中的一些信息,例如"Access-Control-Allow-Origin"和"Access-Control-Allow-Methods"等。如果服务器未正确配置这些响应头部,就会返回一个HTTP状态代码为405的错误。

## 解决方法

要解决这个问题,我们需要在服务器端正确配置响应头部信息,以允许跨域请求。在Asp.net Web API中,我们可以通过在Web.config文件中添加以下代码来实现:

XML

<system.webServer>

<httpProtocol>

<customHeaders>

<add name="Access-Control-Allow-Origin" value="*" />

<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />

<add name="Access-Control-Allow-Headers" value="Content-Type" />

</customHeaders>

</httpProtocol>

</system.webServer>

上述代码将在响应头部中添加了三个自定义的Access-Control-*字段,分别用于指定允许的来源、允许的请求方法和允许的请求头部。

## 示例代码

现在,让我们来看一个简单的示例代码,演示如何使用AngularJS和Asp.net Web API来解决这个问题。

首先,我们需要在AngularJS中编写一个控制器来发送POST请求:

Javascript

var app = angular.module('myApp', []);

app.controller('myCtrl', function($scope, $http) {

$scope.submitForm = function() {

var data = {

name: $scope.name,

emAIl: $scope.emAIl

};

$http.post('https://api.example.com/users', data)

.then(function(response) {

// 请求成功处理

console.log(response.data);

}, function(error) {

// 请求失败处理

console.log(error);

});

};

});

在上述示例代码中,我们定义了一个名为myCtrl的控制器,其中包含一个submitForm函数,用于发送POST请求。我们使用$http.post方法来发送请求,并通过.then方法来处理成功或失败的回调。

接下来,我们需要在Asp.net Web API中编写一个控制器来接收POST请求:

csharp

[RoutePrefix("api/users")]

public class UsersController : ApiController

{

[HttpPost]

[Route("")]

public IHttpActionResult CreateUser(User user)

{

// 在这里处理POST请求

// ...

return Ok("User created successfully");

}

}

public class User

{

public string Name { get; set; }

public string EmAIl { get; set; }

}

在上述示例代码中,我们定义了一个名为UsersController的控制器,其中包含一个名为CreateUser的方法,用于处理POST请求。我们使用了RoutePrefix和Route属性来指定控制器和方法的路由信息。

最后,我们需要在前端页面中添加一个表单来触发POST请求:

html

<div ng-app="myApp" ng-controller="myCtrl">

<form ng-submit="submitForm()">

<input type="text" ng-model="name" placeholder="Name" required>

<input type="emAIl" ng-model="emAIl" placeholder="EmAIl" required>

<button type="submit">Submit</button>

</form>

</div>

在上述示例代码中,我们使用了ng-submit指令来绑定表单的提交事件到submitForm函数。

解决预检响应具有无效的HTTP状态代码405错误

通过正确配置Asp.net Web API的响应头部信息,我们可以解决预检响应具有无效的HTTP状态代码405错误。在Web.config文件中添加相应的配置代码后,服务器将正确响应OPTIONS请求,并允许跨域请求。

在本文中,我们提供了一个简单的示例代码来演示如何使用AngularJS和Asp.net Web API来解决这个问题。希望本文能对你在开发过程中遇到的类似问题有所帮助。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号