【问题标题】:API Call From Word Web Add-In (Office.Js) Is Not Working: CORS Issue?来自 Word Web 加载项 (Office.Js) 的 API 调用不起作用:CORS 问题?
【发布时间】:2016-12-07 01:19:56
【问题描述】:

朋友们,

我正在尝试从 Word 插件调用 API 并收到“拒绝访问”错误。我做了一些研究,看起来“跨源资源共享”是原因。

1.网络 API

我在“http://localhost:61546/api/ORG_NAMES”本地托管 Web API 2 & 我已启用 CORS 以接受所有来源,请参阅下面的 WebApiConfig。

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            var cors = new EnableCorsAttribute("*", "*", "*");
            config.EnableCors(cors);

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }

2。测试应用

为了测试这个 API 以确保它支持 CORS,我创建了下面的页面并托管在 localhost:52799/home.html 上,我能够得到预期的响应。我已经在 IE 10 和 Chrome 中对此进行了测试。

<!DOCTYPE html>
<html>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script>
    $(document).ready(function(){
        $("button").click(function () {
            var obj;
            .support.cors = true;
            $.getJSON("http://localhost:61546/api/ORG_NAMES/112233",
                function (data) {
                alert(data.ORG_ID);
            });
        });
    });
    </script>
</head> 
<body>
    <button>Click me</button>
</body>

3. Word 插件

现在我想从我的 Word Web 插件调用这个 API。从不同主机 https://localhost:44339/ 运行的 Word 加载项,请参见下面的代码。此处 getJSON 返回“拒绝访问”。

      var OrgID; 
      $.getJSON("http://localhost:61546/api/ORG_NAMES/112233",
             function (data) {
                 OrgID = data.ORG_ID;
             });

此外,当我从 word 插件调用 API 时,它不会被提琴手。

注意:这是“Web 插件 --> Word 插件”项目。

4.修复 - 需要帮助

不知道为什么我从 Word-Add-In 收到“拒绝访问”错误,如果 CORS 是问题,那么我的测试应用程序 (#2) 不应该工作,对吗?

我曾尝试使用“$.ajax”、“XMLHttpRequest”调用 JSON,但没有成功。我可能缺少一些配置设置。

在这里感谢任何帮助。 如果您需要更多信息,请告诉我。

【问题讨论】:

  • 我遇到了同样的问题,我将应用程序域更改为适当的值,并且您必须确保您使用的是 https,因为如果您使用的是 http,您会收到 CORs 错误。确保在启动 word 加载项时您是 https
  • 你好匿名朋友 - 你是说如果你尝试通过 Office-JS 的 CORS 请求,并且你的 api 端点不是 SSL,Office JS JavaScript 会直接拒绝它吗? - 这实际上是我所经历的,但我找不到任何文件说是这种情况。
  • 是的。但是每个示例和页面都使用https,例如,请参阅Addressing same-origin policy limitations in Office Add-ins

标签: asp.net-web-api ms-word asp.net-web-api2 office365api office-js


【解决方案1】:

我有同样的问题,使用 ajax 无法调用 web-api.NET MVC。

Web api 端(服务器端):

  1. 在 Web api 中实现 CORS,因为 excel office.js 在不同的端口上工作,并在 excel 中绑定服务器的代理对象,而 web api 被保存在另一个端口上,因此它与在本地拥有 2 个不同的域一样好,因此浏览器会自动阻止请求制作。

所以需要跨域资源共享。

  1. 为 Web api 启用 Https。 http://csharp-video-tutorials.blogspot.com/2016/09/aspnet-web-api-enable-https.html

客户端

  1. 只需使用 ajax 进行调用,如下所示。 网址:'https://localhost:44319/api/Default/PostItems' 注意:https:是必填项。

    function makeAjaxCall(rangeJSON) {
    
    $.ajax({
        url: 'https://localhost:44319/api/Default/PostItems',
        type: 'POST',
        data: rangeJSON,
        contentType: 'application/json;charset=utf-8',
    }).done(function (data) {
        console.log(data)
      app.showNotification(data.Status, data.Message);
    }).fail(function (status) {
       app.showNotification('Error', 'Could not communicate with the server.');
        }).always(showResponse);
    
    }
    
    
    function exceltojson() {
    Excel.run(function (ctx) {
    
        var range = ctx.workbook.worksheets.getItem("Sheet1").getRange("A1:BO765");
    
        range.load("values, numberFormat");
    
        ctx.sync().then(
            function () {
    
               makeAjaxCall(JSON.stringify(range.values));
    
            }).catch(function (error) {
                console.log(error);
    
            });
    });
    
    
    function showResponse(object) {
    
        console.log(object);
        $("#output").text(JSON.stringify(object,null, 4));
    }
    

【讨论】:

    【解决方案2】:

    如果您进行 Ajax 调用,则不需要 Jsonp。您必须确保您都使用 HTTPS 启动,如果它以 HTTP 启动,它将阻止该流量。请记住,office-js 的骨干是 IE 并且在那里;出于安全考虑,api 将只允许 HTTPS

    更新

    请记住,一个 office-js 插件实际上是两个项目,您必须确保您的项目都以 HTTPS 启动。另外我会查看清单文件并查看您的源代码并确保它指向 HTTPS

    【讨论】:

      【解决方案3】:

      由于这听起来像是仅在 Office 加载项中的问题,而不是在常规页面中,您是否尝试在清单文件中设置您的 AppDomains?请参阅https://dev.office.com/docs/add-ins/overview/add-in-manifests中的“指定要在加载项窗口中打开的域”

      <?xml version="1.0" encoding="UTF-8"?>
      <OfficeApp xmlns="http://schemas.microsoft.com/office/appforoffice/1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="TaskPaneApp">
      <Id>c6890c26-5bbb-40ed-a321-37f07909a2f0</Id>
      <Version>1.0</Version>
      <ProviderName>Contoso, Ltd</ProviderName>
      <DefaultLocale>en-US</DefaultLocale>
      <DisplayName DefaultValue="Northwind Traders Excel" />
      <Description DefaultValue="Search Northwind Traders data from Excel"/>
      <AppDomains>
          <AppDomain>https://www.northwindtraders.com</AppDomain>
      </AppDomains>
      <DefaultSettings>
          <SourceLocation DefaultValue="https://www.contoso.com/search_app/Default.aspx" />
      </DefaultSettings>
      <Permissions>ReadWriteDocument</Permissions>
      </OfficeApp>
      

      【讨论】:

      • 我已设置正确的域名,但仍然无法正常工作。现在我正在尝试使用“JSONP”,但看起来它也有一些问题。
      • 采用 JSONP 路由可能会受到限制...如果您无法让一个域上的站点与另一个域上的服务器通信,您始终可以在同一域中使用 WebAPI 代理请求的域。请参阅blogs.msdn.microsoft.com/officeapps/2013/06/10/… 了解更多信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 2020-06-18
      • 1970-01-01
      相关资源
      最近更新 更多