我正在使用javascript REST Api开发SharePoint 2013 Provider托管应用程序.为了对sharepoint项执行创建(POST)或更新(MERGE)操作,我需要使用请求设置"X-RequestDigest"标头.
在SharePoint托管的应用程序中,我能够使用http://contoso.sharepoint.com/SharePointHostedApp/_api/contextinfo服务来检索请求摘要值; 但是,在提供商托管的应用程序中,我无法获得该值.
提供商托管应用程序的第一个区别是,现在我们需要发出跨域请求,因为我们不是在sharepoint站点中运行,而是在不同服务器上托管的不同域中运行.要明确:而不是
$.ajax({
url: appWebUrl + '/_api/contextinfo',
method: "POST",
headers: { "Accept": "application/json; odata=verbose" }
})
Run Code Online (Sandbox Code Playgroud)
我假设我们需要使用它SP.RequestExecutor
来执行跨域请求.当我构造请求时,它看起来如下(我已经将实际的url更改为假的,但基本上我们告诉代理使用主机web有目标并获取/_api/contextinfo
端点):
https://contoso-6f921c6addc19f.sharepoint.com/ProviderHostedApp/_api/SP.AppContextSite(@target)/contextinfo?@target=%27https://contoso.sharepoint.com%27
但是,我收到此错误:Cannot find resource for the request contextinfo.
意味着端点不存在.
我确保使用application/json;odata=verbose
带有空体的正确标头的POST方法.
如何从/_api/contextinfo
服务获取请求摘要值到提供者托管应用程序?
根据我研究的内容:
$('#__REQUESTDIGEST').val()
; 因为提供商托管的应用程序无法使用它.必须有某种方法来获取此值,否则我们将仅限于使用JavaScript时的读取操作.还有其他人用javascript解决了这个问题吗?
从技术上讲,我可以尝试使用服务器上的CSOM实现所需的服务,并使用WebAPI或WCF公开它们,但必须实现它似乎是不合理的.
更新:
我继续尝试添加一个WebAPI控制器,该控制器公开一个检索请求摘要值的服务.这实际上确实检索了请求摘要值; 但是,当尝试在未来调用的标头中使用它时,我收到错误:"The security validation for this page is invalid and might be corrupted. Please use your web browser's Back button to try your …
我想知道Browser Link的最低要求是什么.
我使用Visual Studio 2013 Preview和Web Essentials全新安装了Windows 8.1 Preview.
我已经能够让Browser Link使用一个新的ASP.NET SPA项目,但是当我创建一个新的ASP.NET Empty项目时,添加了一个index.html页面并运行Internet Explorer 11设置为默认值它不起作用.
浏览器链接工具提示一直在说No Browser is connected
.我也试过其他浏览器,包括Chrome,但没有成功.
我在其他地方读到web.config
文件必须debug
设置为'true'.
有什么建议?也许我误解了一些依赖关系或使用新功能的情况.
方案:一种自动完成构件与它自己的控制器和视图,使得其为可,一旦它被移出被渲染到与{{渲染"自动完成"}}或可能新的{{控制}}辅助的任何其它视图的模块部件实验阶段.为了使自动完成独立于其他所有内容,它不应该知道父控制器或选择项目时发生的操作.
我已经试图找出如何使用Ember.Evented混入,这样我可以触发从自动完成的事件如itemSelected然后可以冒泡并通过父视图或控制器捕获.
因此,一如既往,缺乏Ember文档.特别是当谈到Ember.Evented.(为了公平起见文档已经走过了很长的路要走,但我还是希望有更多的.他们说,约定优于配置不提供约定!)不管怎么说,足以抱怨,文档显示余烬事件触发的通用对象工作,我发现这个职位它进入更深入一点:EmberJs是否支持发布/订阅者事件模式?但我认为一个更真实的例子,包括控制器,视图,路由和自动填充等组件会很棒.
我认为这些类型的事件被认为是视图的责任,但是没有用,所以我也将mixin放在控制器上.当你看到jsFiddle时,这是有意义的
在其中你会看到一个假的自动完成控制器,它只是从一个夹具中获取一组静态内容,并显示每个项目的两个按钮,你可以点击它们从视图或控制器触发一个事件.在一个实际例子中,将观察文本框中的输入,并且将更新内容以基于输入呈现不同的建议,但这对于该示例并不重要.
的jsfiddle:http://jsfiddle.net/wCfb9/
我最怀疑这些行:this.on("myEvent", this.addItem);
因为触发事件的功能显然被调用,但它好像事件不传播或索引控制器和视图不实际上正确设置以响应事件.
以下是主要问题:
我需要更改什么才能使索引控制器响应自动完成触发的事件?
实现这一目标的MVC最合适的方法是什么?应该在视图/控制器上触发/接收?
有一个更好的方法吗?
旁注:我目前的解决方案是needs: ["index"]
在自动完成控制器中添加一个而不是触发事件,我只是从自动完成控制器显式调用索引控制器中的方法.这有很多问题,首先是控制器之间的紧密耦合,如果自动完成被认为影响多个控制器或者在别处重新使用并且必须重新配置等,则不能很好地扩展.
希望我能够清楚地解释清楚.所有帮助表示赞赏.
我已经设置了一个azure函数,该函数是从添加到特定容器的blob触发的.blob是一个.zip文件,我的目的是adm-zip
将blob提取到目录然后读取内容.我对这里的文档感到困惑:https:
//github.com/Azure/azure-content/blob/master/articles/azure-functions/functions-bindings-storage.md#blob-trigger-supported-types
哪个说输入参数可以是Object或String.我没有在function.json中看到任何地方指定我想要输入的内容.
在我下面的代码中,它的类型似乎是一个字符串,但由于它不打印任何东西,我认为它实际上是一个表示文件内容的字节缓冲区.为了解决这个问题,我尝试将缓冲区写入本地文件,但是没有成功.它没有抛出错误或打印出来saved blob to...
在我的function.json中我有这个:
{
"bindings": [
{
"name": "xmlZipBlob",
"type": "blobTrigger",
"direction": "in",
"path": "balancedataxml",
"connection": "sc2iq_STORAGE"
}
],
"disabled": false
}
Run Code Online (Sandbox Code Playgroud)
然后我xmlZipBlob
作为我的函数的第二个参数:
var fs = require('fs');
module.exports = function (context, xmlZipBlob) {
context.log('Node.js blob trigger function processed blob:', xmlZipBlob);
context.log(`typeof xmlZipBlob:`, typeof xmlZipBlob);
fs.writeFile('xmlZip.zip', xmlZipBlob, (err) => {
if (err) {
throw err;
}
context.log('saved blob to loal file called xmlZip.zip');
context.done();
});
};
Run Code Online (Sandbox Code Playgroud)
1. blob函数的输入参数的类型是什么?
2.如何控制输入参数是Object还是String? …
我无法使用节点文件系统模块的azure函数工作.
我创建了一个全新的功能应用程序,具有最基本的HTTP触发功能,并包含'fs'模块:
var fs = require('fs');
module.exports = function (context, req, res) {
context.log('function triggered');
context.log(req);
context.done();
}
Run Code Online (Sandbox Code Playgroud)
这很好用.我在实时流日志和函数调用列表中看到了完整的请求.
但是,只要我添加实际使用文件系统的代码,它就会崩溃 azure函数. 它既不会完成也不会抛出错误.它似乎也没有出现在天蓝色的函数调用列表中,这是可怕的,因为这是失败信息的丢失,我可能认为我的服务在实际崩溃时运行正常.
var fs = require('fs');
module.exports = function (context, req, res) {
context.log('function triggered');
context.log(req);
fs.writeFile('message.txt', 'Hello Node.js', (err) => {
if (err) throw err;
console.log('It\'s saved!');
context.done();
});
}
Run Code Online (Sandbox Code Playgroud)
在fs.writeFile
直接从node.js的网站采取代码:
https://nodejs.org/dist/latest-v4.x/docs/api/fs.html#fs_fs_writefile_file_data_options_callback
我context.done()
在回调中添加了该代码,但该代码段在正常开发环境中应该没有问题.
这提出了一些问题:
根据我的理解,即使这被认为是无服务器计算,仍然有一个VM/Azure网站应用服务,其下面有一个文件系统.我可以使用Kudu控制台并导航并查看/ wwwroot和/ home/functions/secrets文件中的所有文件.
想象一下这样一种场景,即编写azure函数来编写具有唯一名称的文件而不执行清理,最终会占用主机VM上的所有磁盘空间并降低性能.这可能是由开发人员意外发生的,并且可能会被忽视,直到为时已晚.
这让我想知道是不是设计不使用文件系统,或者我的函数是否写错了?