如果在SenseNet设置对象中使用JSON数组,则无法通过OData API访问它们。
例如,请考虑以下SenseNet设置对象,默认情况下安装在Root/System/Settings/Portal.settings
:
{
ClientCacheHeaders: [
{ ContentType: "PreviewImage", MaxAge: 1 },
{ Extension: "jpeg", MaxAge: 604800 },
{ Extension: "gif", MaxAge: 604800 },
{ Extension: "jpg", MaxAge: 604800 },
{ Extension: "png", MaxAge: 604800 },
{ Extension: "swf", MaxAge: 604800 },
{ Extension: "css", MaxAge: 600 },
{ Extension: "js", MaxAge: 600 }
],
UploadFileExtensions: {
"jpg": "Image",
"jpeg": "Image",
"gif": "Image",
"png": "Image",
"bmp": "Image",
"svg": "Image",
"svgz": "Image",
"tif": "Image",
"tiff": "Image",
"xaml": "WorkflowDefinition",
"DefaultContentType": "File"
},
BinaryHandlerClientCacheMaxAge: 600,
PermittedAppsWithoutOpenPermission: "Details"
}
通过OData API查看此对象时,不包括ClientCacheHeaders字段:
{
"d": {
"UploadFileExtensions.jpg": "Image",
"UploadFileExtensions.jpeg": "Image",
"UploadFileExtensions.gif": "Image",
"UploadFileExtensions.png": "Image",
"UploadFileExtensions.bmp": "Image",
"UploadFileExtensions.svg": "Image",
"UploadFileExtensions.svgz": "Image",
"UploadFileExtensions.tif": "Image",
"UploadFileExtensions.tiff": "Image",
"UploadFileExtensions.xaml": "WorkflowDefinition",
"UploadFileExtensions.DefaultContentType": "File",
"BinaryHandlerClientCacheMaxAge": 600,
"PermittedAppsWithoutOpenPermission": "Details",
}
}
如果使用以下查询专门搜索ClientCacheHeaders字段:
Odata.svc/Root/System/Settings('Portal.settings')?&metadata=no&$select=ClientCacheHeaders
API返回null:
{
"d": {
"ClientCacheHeaders": null
}
}
我知道设置文件中允许使用JSON数组,因为上述示例在描述设置用法的SenseNet wiki page中引用。
我是否错误地执行了我的OData查询,或者这是SenseNet API中的某种解析错误?
答案 0 :(得分:3)
这是Miklos建议的自定义OData功能的实现。完成此操作后,您必须按照here所述注册OData调用。
public static class OData
{
[ODataFunction]
public static string GetMySettings(Content content)
{
var retstr = "";
try
{
var settingsFile = Settings.GetSettingsByName<Settings>("MySettings", content.Path);
var node = Node.LoadNode(settingsFile.Path) as Settings;
var bindata = node.GetBinary("Binary");
using (var sr = bindata.GetStream())
using (var tr = new System.IO.StreamReader(sr))
retstr = tr.ReadToEnd();
}
catch (Exception e)
{
SnLog.WriteException(e);
}
return retstr;
}
}
答案 1 :(得分:2)
这是odata api背后当前动态json字段转换的限制。它实际上将这些设置json属性转换为 sensenet字段,因此您在odata响应中看到的不是实际设置json,而只是可以转换为sensenet字段的片段(对于好奇的:它发生在 JsonDynamicFieldHelper 类, BuildDynamicFieldMetadata 方法中。
不幸的是,在sensenet中有没有内置字段类型来处理json数组,不可能将json数组转换为字段值,这就是系统跳过它的原因。 / p>
在javascript 中分两步获取原始设置json 。以下请求为您提供二进制字段的直接URL:
/odata.svc/Root/System/Settings('Portal.settings')?&metadata=no&$select=Binary
...像这样:
/binaryhandler.ashx?nodeid=1084&propertyname=Binary&checksum=1344168
...如果你加载它,你将获得完整的原始json,包括数组。
请注意:访问者无法访问设置 默认,原因是:它们可能包含敏感信息。因此,如果 您希望让您的用户直接访问设置(您尝试的方式) 或者上面第一个解决方法中描述的方式),你必须这样做 为这些设置提供必要用户组的打开权限 文件。第二种解决方法不是这种情况。
创建一个custom odata action,以您选择的格式从服务器返回设置。这是一个更好的解决方案,因为这样您可以控制客户端实际可以访问设置文件的哪些部分。