Tridion 2009 SP1:经纪人如何获取二进制URL?

时间:2012-05-28 17:22:30

标签: tridion tridion2009 tridion-content-delivery

我正在尝试检索多媒体组件的二进制文件,该文件作为动态组件演示文稿发布。

我可以在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的任何想法?我是在正确的轨道上吗?

罗布

4 个答案:

答案 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);
            }
        }
    }