我正在尝试检索多媒体组件的二进制文件,该文件作为动态组件演示文稿发布。
我可以在Broker数据库的Binaries表中看到Url,但我似乎无法使用以下任何一段代码获取二进制url:
使用SQLBinaryMetaHome:
using (var sqlBinMetaHome = new Com.Tridion.Broker.Binaries.Meta.SQLBinaryMetaHome())
{
int componentItemId = int.Parse(queryStringId.Split('-')[1]);
var binaryMeta = sqlBinMetaHome.FindByPrimaryKey(new TCDURI(publicationId, 16, componentItemId));
if (binaryMeta != null)
{
VideoBinaryUrl = binaryMeta.GetURLPath();
}
else
{
Logger.Log.ErrorFormat("Failed ot load via SQL Binary Meta {0}", queryStringId);
}
}
使用二元元工厂:
using (var b = new BinaryMetaFactory())
{
var binaryMeta = b.GetMeta(queryStringId);
if (binaryMeta != null)
{
VideoBinaryUrl = binaryMeta.UrlPath;
}
else
{
Logger.Log.ErrorFormat("Failed to load binary meta {0}", queryStringId);
}
}
我可以使用ComponentMetaFactory加载Component Meta数据。
关于我为什么无法加载Binary Meta的任何想法?我是在正确的轨道上吗?
罗布
答案 0 :(得分:5)
看起来您的第一个示例是从内部DLL(Tridion.ContentDelivery.Interop.dll
)导入(自动生成的)方法。请不要使用它们并坚持使用Tridion.ContentDelivery命名空间(Tridion.ContentDelivery.dll
)中的那些。
您可以在SDL Tridion World上找到CHM格式的官方documentation for the Content Delivery .NET API(单击链接,登录该站点并再次单击该链接)。从这个文档来看这个例子:
//create a new BinaryMetaFactory instance:
BinaryMetaFactory binaryMetaFactory = new BinaryMetaFactory();
//find the metadata for the specified binary
BinaryMeta binaryMeta = binaryMetaFactory.GetBinaryMeta("tcm:1-123");
//print the path to the output stream:
if(binaryMeta!=null) {
Response.Write("Path of the binary: " + binaryMeta.UrlPath);
}
//Dispose the BinaryMetaFactory
binaryMetaFactory.Dispose();
来自Tridion.ContentDelivery.Meta.BinaryMetaFactory
的工厂类Tridion.ContentDelivery.dll
。我确实也找不到该类中的GetBinaryMeta
方法,因此代码示例中似乎存在错误。您应该使用的最有可能的方法是GetMeta
。
答案 1 :(得分:3)
您是否有理由不使用二进制链接将Link对象获取到所需二进制文件的特定Variant?请记住,任何DCP都可能呈现多媒体组件的多种变体。然后,您可以从Link对象获取二进制文件的URL。
在文档中查找BinaryLink以获取更多详细信息。
答案 2 :(得分:1)
试试这个: -
BinaryMeta binaryMeta = b.GetBinaryMeta(queryStringId);
if(binaryMeta != null) {
VideoBinaryUrl = binaryMeta.URLPath;
}
答案 3 :(得分:1)
我在代码上做了一个SQL Profiler,并注意到这是因为我部署了我的测试应用程序而不是调用代理。在实际的Tridion发布站点中运行代码确实命中了数据库,但它为variantId列传递了值“[#def#]”。
我现在已经使用以下代码:
IComponentMeta cm = cmf.GetMeta(queryStringId);
if (cm != null)
{
TcmId = queryStringId;
Title = cm.TryGetValue("title");
Summary = cm.TryGetValue("summary");
Product = cm.TryGetValue("product");
if (cm.SchemaId == StreamingContentSchemaId)
{
VideoId = cm.TryGetValue("video_url");
IsVimeo = true;
}
else if (cm.SchemaId == WebcastSchemaId)
{
using (var b = new BinaryMetaFactory())
{
var binaryMeta = b.GetMeta(queryStringId, "tcm:0-" + cm.OwningPublicationId + "-1");
if (binaryMeta != null)
{
VideoBinaryUrl = binaryMeta.UrlPath;
}
else
{
Logger.Log.ErrorFormat("Failed to load binary meta {0}", queryStringId);
}
}
}