【发布时间】:2019-01-29 17:51:42
【问题描述】:
我有一个 Outlook Web 插件。在 本地(调试环境) 中测试时,它可以正常工作,但是当 Web API 已发布到生产环境 并且 Outlook 插件尚未发布到生产环境 ( Outlook 商店),我收到 CORS 相关问题,发出请求时返回的 错误代码 是 404 并且返回的错误消息是对预检的响应没有 HTTP ok 状态。
我在 Web API 本地(未发布到生产环境) 中遇到了类似问题,但我能够通过添加以下代码来修复它
在 Web Config 文件中(服务器端)
<location path="api/v1/plugin">
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type, Accept, Token, Key" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, OPTIONS" />
<add name="Access-Control-Max-Age" value="3600" />
<add name="Access-Control-Allow-Credentials" value="true" />
</customHeaders>
</httpProtocol>
</system.webServer>
在 HTTP 选项的 Web API 控制器更改中
[HttpOptions]
[Route("login")]
public void EnableCors()
{
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.StatusCode = (int)HttpStatusCode.OK;
}
}
在客户端(Outlook 插件)中,我使用 Ajax 来调用 Web API。
$.ajax({
type: "POST",
url: call,
async: false,
headers: {
'Token': token, 'Key': keyVal
},
contentType: "application/javascript",
beforeSend: function (xhr) {
xhr.withCredentials = true;
},
crossDomain: true,
success: function (data, status, jqXHR) {
createRoamingSetting('apiData',JSON.stringify(data));
},
error: function (jqXHR, status, err) {
triggerAlert("error", err.message);
}
});
当包含上述两个代码时,它在调试版本中运行良好。我能够向 Web API 发出请求(未发布 - localhost)。但是当 Web API 发布到 Production 时,对 Web API 的请求返回 404 错误。
下面是我在生产版本中遇到的错误的屏幕截图。
任何帮助将不胜感激:)
【问题讨论】:
-
您是否在服务初始化过程中沿路径某处调用了
HttpConfiguration.EnableCors方法?你的路由代码说login,但你的网络配置部分说plugin。 -
您看到的错误是插件特有的吗?您是否尝试过从浏览器进行相同的 Web API 调用?
-
@NoRefundsNoReturns :不,我没有调用 HttpConfiguration.EnableCors 。但是,自从 SIT 在 localhost 上工作以来,这些更改不应该在 SIT 中工作吗?配置更改似乎是正确的,因为除了登录 ex 之外,我们还有多个路由值:api/v1/plugin/login 或 api/v1/plugin/refresh。所以
应该适用于 api/v1/plugin/login 和 api/v1/plugin/refresh。即使我在配置文件中将路径指定为 api/v1/plugin/login,我也会收到相同的错误。如果我错了,请纠正我。 -
@OutlookAdd-insTeam-MSFT :API 似乎工作正常。由于这是一个 POST,我无法在浏览器中获取有效数据,但这在其他客户端中可以正常工作。
标签: ajax asp.net-web-api cors outlook-addin office-js