HTTP Post 到 Web API 2 - 选项请求已收到并已处理未收到进一步的请求

HTTP Post to Web API 2 - Options request received and handled no further request received

我有一个使用 MVC 和 AngularJS 的 Web 应用程序,它连接到我在单独项目中设置的 Web API 2 api。

目前我可以毫无问题地从 Api 检索信息。

然而,当我尝试执行 HTTP Post 时,我没有收到任何响应,最初我遇到了飞行前请求失败的问题,我现在已经在我的控制器中处理了这个问题,但是它确实如此在收到 OK 消息后没有发送正确的请求。

我在 API 中包含了 Angular 工厂和 C# 控制器的代码。

[EnableCors(origins: "*", headers: "*", methods: "*")]
public class RegisterController : ApiController
{
    public string Post()
    {

        return "success";
    }

    public HttpResponseMessage Options()
    {
        return new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
    }
}


var RegistrationFactory = function($http, $q, ApiAddress) {
return function(model) {
   // $http.post(ApiAddress.getApiAddress() + '/Register/Post', model.ToString());

    $http({
        method: "POST",
        url: ApiAddress.getApiAddress() + '/Register/Post',
        data: model,
        headers: { 'Content-Type': 'application/json; charset=utf-8' }
    }).success(function(data) {
        $location.path("/");
    });
}
};

RegistrationFactory.$inject = ['$http', '$q', 'ApiAddress'];

编辑:

我对此仍然不满意,但是我在 Internet Explorer 中进行了测试,它完全没有问题。

我在 chrome 中通过禁用 Web 安全启动使其正常工作,但显然这并不理想,因为它无法在启用安全的用户 PC 上运行。

我看到你们在服务端做了CORS的适配。但我看不到任何客户端 (javascript) 改编。也许你应该在调用服务之前添加下面的代码。

$http.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];

让我知道这是否解决了问题。在所有情况下都为我工作:)

奇怪的是,您的 GET 有效,但您的 POST 无效。

我会推荐 运行将 Google Chrome 中的代码与网络安全 启用 结合使用(这样我们就可以看到它出错了)并显示 F12 开发人员选项。

Select“网络”选项卡,运行 您的代码,然后观察调用 POST 时发生的情况。

您的服务 return 是“200 OK”状态还是其他值?

是否有任何类型的响应得到 returned?

可能值得尝试一下,并在您的原始问题中附上结果的屏幕截图。它可能有助于确定原因。

I am still not having any joy with this, however I tested in Internet Explorer and it works with no problems at all.

顺便说一句,您的公司没有任何单点登录设置,是吗?我们遇到过 IE 可以正常工作,但其他浏览器不允许单点登录的问题。只是一个想法...

CORS 需要 OPTIONS-preflight,其响应中包含 HTTP headers,告诉浏览器是否允许访问资源。

例如HTTP 响应 Headers:

Access-Control-Allow-Headers: authorization
Access-Control-Allow-Origin: *

因为您的 C# 控制器中有一个自定义选项处理程序,所以似乎没有返回那些 HTTP headers,预检后停止浏览器进行调用。

避免选项方法,你应该很好。