Word Web加载项(Office.Js)的API调用不起作用:CORS问题?

时间:2016-08-01 20:37:28

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

我正在尝试从Word加载项调用API并获取"访问被拒绝"错误。我做了一些研究,看起来像#34; Cross Origin Resource Sharing"是原因。

1。 Web API

我正在本地托管Web API 2" http://localhost:61546/api/ORG_NAMES" &安培;我已经启用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&铬。

<!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返回&#34;访问被拒绝&#34;。

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

此外,当我从word加载项调用API时,它不会成为fiddler。

注意:这是&#34; Web插件 - &gt; Word加载项&#34;项目。

4。修复 - 需要帮助

我不知道为什么会得到&#34;访问被拒绝&#34;来自Word-Add-In的错误,如果CORS是问题,那么我的测试应用程序(#2)应该不起作用,对吗?

我尝试使用&#34; $。ajax&#34;,&#34; XMLHttpRequest&#34;来调用JSON。但它没有用。我可能会错过一些配置设置。

在这里感谢任何帮助。 如果您需要更多信息,请与我们联系。

3 个答案:

答案 0 :(得分:2)

因为它只是在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>

答案 1 :(得分:2)

如果您正在进行Ajax调用,则不需要Jsonp。您必须确保所有人都使用HTTPS启动,如果它在HTTP中启动,它将阻止该流量。请记住,办公室js背骨是IE,并在那里;出于安全考虑,api只允许HTTPS

<强>更新

请记住,office-js add in实际上是两个项目,你必须确保你的项目都是用HTTPS启动的。另外,我只需查看Manifest文件并查看您的源代码并确保它指向HTTPS

答案 2 :(得分:0)

我在使用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));
    }