PUT 的 Azure 搜索和 CORS 问题

Azure Search and CORS issue with PUT

这是我第一个 post 的 follow-up 问题。我已成功将我的 AngularJS 网站部署到 Azure,我可以使用 REST API GET 方法与 Azure 搜索进行交互。现在我正面临 PUT 方法的问题。它抱怨说我的飞行前请求没有通过控制检查。通过检查网络流量,我可以看到浏览器正在对 Azure 搜索执行 OPTIONS 请求方法,响应代码为 404 Not Found。

我注意到其他人也遇到过这个 problem ,解决方法是使用标准定价等级。我已经在标准版上了,但问题仍然存在。我的 Angular 搜索 CORS 已设置为“*”。我试图通过添加 headers 选项来修改我的客户端 AngularJS $http 代码,但仍然无法正常工作。

任何想法将不胜感激。

更新 #2 以回答@Bruce Johnston,我想我不能将太多代码粘贴为评论块,所以我将它们放在这里。

这是一个正在运行的 $http.get:

$http.get("https://mywebsibe/indexes/contact1/docs?api-version=2016-09-01",
              {
                headers: {
                  "Accept": "application/json",
                  "api-key": "xxx"
                },
                params: {
                  //api-version: '2016-09-01',
                  queryType:  "full",
                  search: searchString
                }
              }
              )

这是遇到 CORS 问题的 PUT:

$http.put("https://mywebsite/indexes/contact1/docs?api-version=2017-11-11",
      {
        headers: {
         "Access-Control-Allow-Credentials": "true",
         "Access-Control-Allow-Origin": "*",
         "Access-Control-Allow-Methods": "POST, GET, OPTIONS, DELETE",
         "Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept",
         "Accept": "application/json",
         "api-key": "xxx"
        },
        data: {
            "value": [
                {
                    "@search.action": "upload",
                    "ContactId": "id1",
                    "FirstName": "New",
                    "LastName": "Guy",
                    "Dob": "1990-01-31",
                    "Gender": "M",
                    "Email": "ng@somewhere.org"
                }
            ]
        }

这里有一些问题阻止了它的工作。

首先,主机名似乎不正确。它们应该是后缀为 .search.windows.net 的完全限定域名,但事实并非如此。

其次,由于三个原因,PUT 请求将无法工作:

  1. 它 returns 404 因为 URL 不正确,假设您正在尝试将文档上传到索引。索引 API 的 URL 是 https://<search-service-name>.search.windows.net/indexes/<index-name>/docs/index.
  2. 索引 API 是通过 POST 访问的,而不是 PUT。
  3. 即使您有正确的 URL 和 HTTP 方法,CORS 也不支持索引 API。 Azure 搜索仅支持通过 CORS 的查询操作。不支持管理操作或修改数据的操作。这已记录在案 here.

如果您的目标是将文档从浏览器上传到您的索引,您将需要以某种方式代理该请求。通常我们建议从您自己的 Web API/middle 层调用 Azure 搜索,因为这样可以避免将您的 api-密钥发送到浏览器。