友
我正在尝试从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。但它没有用。我可能会错过一些配置设置。
在这里感谢任何帮助。 如果您需要更多信息,请与我们联系。
答案 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端(服务器端):
因此需要跨源资源共享。
客户端
只需使用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));
}