【问题标题】:HTTP Post to Web API 2 - Options request received and handled no further request receivedHTTP Post to Web API 2 - 收到并处理了选项请求,没有收到进一步的请求
【发布时间】:2015-09-02 13:25:02
【问题描述】:

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

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

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

我已经在 API 中包含了我的 Angular Factory 和 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 中进行了测试,它完全没有问题。

我通过禁用 web 安全性开始使其在 chrome 中运行,但显然这并不理想,因为它无法在启用安全性的用户 PC 上运行。

【问题讨论】:

  • 在 Firefox 中可以使用吗?
  • 是的,我认为这与 Chrome 的安全性有关。
  • 您是否尝试过发布到域,例如web.domain.com 和 api.domain.com 看看它们在同一个域上是否有效?
  • 是的,同样的问题仍然存在。
  • @BenSharpe 在我看来,您不需要 API 控制器中的 Options 方法。如果为跨域启用了 cors,则 OPTIONS 请求将在主请求(在您的情况下为 POST)之前自动发送,以获得服务器的“批准”。

标签: c# asp.net-mvc angularjs asp.net-web-api2


【解决方案1】:

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

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

如果这能解决问题,请告诉我。在所有情况下都为我工作:)

【讨论】:

  • 可能还需要添加$httpProvider.defaults.withCredentials = true;
【解决方案2】:

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

我建议在启用网络安全(这样我们可以看到它出错)并显示 F12 开发人员选项的情况下在 Google Chrome 中运行代码。

选择“网络”选项卡,运行您的代码,然后观察调用 POST 时会发生什么。

您的服务是否返回“200 OK”状态或其他值?

是否会返回任何类型的响应?

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

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

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

【讨论】:

    【解决方案3】:

    CORS 需要一个 OPTIONS-preflight,它的响应中有 HTTP 标头,告诉浏览器是否允许访问资源。

    例如HTTP 响应标头:

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

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

    避免使用 Options 方法,你应该很好。

    【讨论】:

      猜你喜欢
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 2016-03-18
      相关资源
      最近更新 更多