我最近将我们的服务器从Rackspace CloudSites(在Apache/Linux上运行)转移到了Windows Azure网站.自迁移以来,我们的REST API上的所有jQuery AJAX请求都因CORS而失败.
我们使用自定义标头,因此jQuery在运行实际API调用之前会发出Pre-flight HTTP OPTIONS请求.问题是OPTIONS请求似乎没有到达我的PHP代码,而是由其他一些我似乎无法控制的实体(显然是Web服务器)返回.
我已经使用以下标题几年了所以我很确定问题不在PHP代码中:
<?php
$this->output->set_header("Access-Control-Allow-Origin: *");
$this->output->set_header("Access-Control-Allow-Methods: GET,POST,DELETE,HEAD,PUT,OPTIONS");
$this->output->set_header("Access-Control-Allow-Headers: X-Olaround-Debug-Mode, Authorization, Accept");
$this->output->set_header("Access-Control-Expose-Headers: X-Olaround-Debug-Mode, X-Olaround-Request-Start-Timestamp, X-Olaround-Request-End-Timestamp, X-Olaround-Request-Time, X-Olaround-Request-Method, X-Olaround-Request-Result, X-Olaround-Request-Endpoint" );
?>
Run Code Online (Sandbox Code Playgroud)
我猜这个问题是特定于Azure网站的,因为代码似乎在我的开发机器(Windows 8/IIS 8.0)上运行良好.我是Azure的新手(以及一般的基于Windows的托管)所以我几乎不知道如何处理和调试此问题,因为Azure网站允许非常小的控制.
在SO中有这么多问题与此类似,但没有一个问题解决了我的问题.
我已经托管了一个angularjs网站http://localhost:49595,我正在调用一个Web Api 2.1服务http://localhost:63019.我在web.config中的web api服务器上启用了CORS.GET/buildings/1和GET/buildings /?$ top = 10&$ skip = 1的请求工作正常.
说到PUT,我收到以下错误:{"Message":"找不到与请求URI匹配的HTTP资源http://localhost:63019/buildings/1105'.","MessageDetail":"在控制器'Building'上找不到匹配的操作要求." }

我可以看到浏览器将OPTIONS请求发送到服务器,但是要更新的实际数据不在请求中(在fiddler中检查.不确定OPTIONS查询是否正常).

我在web api上启用了跟踪,我看到了以下日志.https://gist.github.com/rnarayana/8905229 OPTIONS请求(第69行)说它需要进行PUT.在第77行附近,看起来它选择了正确的动作.然后控制器被处理掉.此外,控制器正在实例化两次.
我怎样才能知道发生了什么?
在AngularJS中调用代码:尝试:
$http.put('http://localhost:63019/buildings/' + building.BuildingId, building)
.then(onSuccess, onError);
Run Code Online (Sandbox Code Playgroud)
也
$http({
url: urlBase + '/' + building.BuildingId,
dataType: 'json',
method: 'PUT',
data: building,
headers: {"Content-Type": "application/json"}
}).then(onSuccess, onError);
Run Code Online (Sandbox Code Playgroud)
这些在我的控制器中:
[HttpGet]
[Route("buildings/")]
public IHttpActionResult GetAll(ODataQueryOptions<BuildingViewModel> queryOptions)
{
}
[HttpGet]
[Route("buildings/{id}")]
public IHttpActionResult Get(long id)
{
}
[Route("buildings/")]
[HttpPost]
public IHttpActionResult Post(BuildingEditViewModel buildingEditViewModel)
{
}
[HttpPut]
[Route("buildings/{id}")]
public …Run Code Online (Sandbox Code Playgroud) 我为我的网站使用了两个项目.一个用于Mvc项目和Api项目.我在web.config文件中添加了以下代码,该文件位于Api项目中,
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Authorization
Run Code Online (Sandbox Code Playgroud)
Api项目中的动作方法如下,
[HttpPost]
[Route("api/ajaxapi/caselistmethod")]
public List<CaseValues> AjaxCaseListMethod()
{
List<CaseValues> caseList = new List<CaseValues>();
return caseList;
}
Run Code Online (Sandbox Code Playgroud)
和ajax调用如下,这是在Mvc项目中,
$.ajax({
type: "POST",
url: "http://localhost:55016/api/ajaxapi/caselistmethod",
beforeSend: function (request) {
request.setRequestHeader("Authorization", getCookie("Token"));
},
success: function (response) {
}
});
Run Code Online (Sandbox Code Playgroud)
但是显示如下错误,
选项http:// localhost:55016/api/ajaxapi/caselistmethod 405(方法不允许)XMLHttpRequest无法加载http:// localhost:55016/api/ajaxapi/caselistmethod.预检的响应具有无效的HTTP状态代码405
但没有Header工作正常.我也需要传递标题.所以请提出任何建议.
谢谢...

我试图从我的前端部署/pod(在 NGINX 中运行的 Angular 7 应用程序)向我的后端服务(NET Core WEB API)发出一个 http 请求。
URL,如图所示,是http://k8s-demo-api:8080/api/data。
//environment.prod.ts in Angular App
export const environment = {
production: true,
api_url: "http://k8s-demo-api:8080/api"
};
Run Code Online (Sandbox Code Playgroud)
我的 API 中启用了 CORS:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using K8SDockerCoreWebApi.Contexts;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace K8SDockerCoreWebApi
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// …Run Code Online (Sandbox Code Playgroud) cors ×2
jquery ×2
angular ×1
angular7 ×1
angularjs ×1
asp.net-mvc ×1
azure ×1
c# ×1
cross-domain ×1
javascript ×1
kubernetes ×1
nginx ×1
php ×1
put ×1