C# Umbraco v6.1的文件系统提供程序

C# Umbraco v6.1的文件系统提供程序,c#,azure,blob,umbraco,C#,Azure,Blob,Umbraco,我正在尝试创建一个新的MediaFileSystemProvider,它可以无缝地将媒体存储在Azure Blob存储中 我从Umbraco v6.1源代码复制了MediaFileSystem类作为起点 然后,我编辑了/config/FileSystemProviders.config文件,插入了我的新类详细信息 重新启动Umbraco时,会调用新类,但出现错误: 找不到接受0参数的类型“mysite.core.umbracoExtensions.FileSystemProviders.Azur

我正在尝试创建一个新的MediaFileSystemProvider,它可以无缝地将媒体存储在Azure Blob存储中

我从Umbraco v6.1源代码复制了MediaFileSystem类作为起点

然后,我编辑了/config/FileSystemProviders.config文件,插入了我的新类详细信息

重新启动Umbraco时,会调用新类,但出现错误:

找不到接受0参数的类型“mysite.core.umbracoExtensions.FileSystemProviders.AzureBlobStorageProvider,mysite.core”的构造函数

这是我的班级:

方法

知道我做错了什么吗


干杯

为什么我花了几个小时试图找到答案,然后在发布后很快就找到了

这个问题有两个方面:

1) 我应该一直在实现IFileSystem(灵感来自Amazon3Provider源代码)


2) 从FileSystemProviders.config文件传递的参数名未包含在构造函数中

为什么我花费数小时试图找到答案,然后在发布后很快就找到了

这个问题有两个方面:

1) 我应该一直在实现IFileSystem(灵感来自Amazon3Provider源代码)


2) 从FileSystemProviders.config文件传递的参数名未包含在构造函数中

考虑到我从这里的人那里得到的所有帮助,我无法完成这一半:)

我安装了一个新的Umbraco v6.1.6并确认了MediaService。删除的事件肯定不会被触发/挂接到下面的代码中。我将去了解如何提交bug

对于任何有兴趣在Azure存储中存储Umbraco媒体项目的人,下面是我是如何做到的。您可以使用“CDN启用”键打开/关闭显示图像内容的CDN,并使用“AzureCDNUploadEnabled”键打开/关闭上载,而无需每次触摸视图

仅供参考,Azure Blob存储的实际CDN部分目前不可用。过去是,现在不是,很明显总有一天会再次发生

通过设置“AzureCDNCacheControlHeader”值以在上载时更新缓存控制标头,可以限制数据使用并加快图像传递。下面的值将图像设置为30天后过期,然后重新验证

将其添加到web.config appsettings节点:

    <!-- cdn config -->

    <!-- used for razor rendering -->
    <add key="CDNPath" value="https://utest.blob.core.windows.net"/>
    <add key="CDNEnabled" value="true"/>

    <!-- used for media uploads -->
    <add key="AzureCDNStorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName={yourAccount};AccountKey={yourKey}"/>
    <add key="AzureCDNStorageAccountName" value="{yourStorageAccount}"/>
    <add key="AzureCDNBlobContainerName" value="media"/>
    <add key="AzureCDNRootUrl" value="https://{yourAccount}.blob.core.windows.net"/>
    <add key="AzureCDNUploadEnabled" value="true"/>
    <add key="AzureCDNCacheControlHeader" value="must-revalidate, public, max-age=604800"/> <!-- change to whatever suits you -->
    <!-- end cdn -->
最后在RazorView中显示:

@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{
    Layout = "BasePage.cshtml";
}

@using utest1.umbracoExtensions.helpers

@{

    var ms = ApplicationContext.Current.Services.MediaService;
    var img = ms.GetById(int.Parse(CurrentPage.Image));
}

<h1>Umbraco on Azure is getting there!</h1>
<p>@img.Name</p>
<img alt="@img.Name" src="@CDNImage.ConvertUrlToCDN(img.GetValue("umbracoFile").ToString())" />
@继承Umbraco.Web.Mvc.UmbracoTemplatePage
@{
Layout=“BasePage.cshtml”;
}
@使用utest1.umbracoExtensions.helpers
@{
var ms=ApplicationContext.Current.Services.MediaService;
var img=ms.GetById(int.Parse(CurrentPage.Image));
}
Azure上的Umbraco正在到达那里!
@姓名

欢迎提出改进建议


啊,回馈的感觉真好:)

考虑到我从这里的人们那里得到的帮助,我不能把这件事做了一半:)

我安装了一个新的Umbraco v6.1.6并确认了MediaService。删除的事件肯定不会被触发/挂接到下面的代码中。我将去了解如何提交bug

对于任何有兴趣在Azure存储中存储Umbraco媒体项目的人,下面是我是如何做到的。您可以使用“CDN启用”键打开/关闭显示图像内容的CDN,并使用“AzureCDNUploadEnabled”键打开/关闭上载,而无需每次触摸视图

仅供参考,Azure Blob存储的实际CDN部分目前不可用。过去是,现在不是,很明显总有一天会再次发生

通过设置“AzureCDNCacheControlHeader”值以在上载时更新缓存控制标头,可以限制数据使用并加快图像传递。下面的值将图像设置为30天后过期,然后重新验证

将其添加到web.config appsettings节点:

    <!-- cdn config -->

    <!-- used for razor rendering -->
    <add key="CDNPath" value="https://utest.blob.core.windows.net"/>
    <add key="CDNEnabled" value="true"/>

    <!-- used for media uploads -->
    <add key="AzureCDNStorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName={yourAccount};AccountKey={yourKey}"/>
    <add key="AzureCDNStorageAccountName" value="{yourStorageAccount}"/>
    <add key="AzureCDNBlobContainerName" value="media"/>
    <add key="AzureCDNRootUrl" value="https://{yourAccount}.blob.core.windows.net"/>
    <add key="AzureCDNUploadEnabled" value="true"/>
    <add key="AzureCDNCacheControlHeader" value="must-revalidate, public, max-age=604800"/> <!-- change to whatever suits you -->
    <!-- end cdn -->
最后在RazorView中显示:

@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{
    Layout = "BasePage.cshtml";
}

@using utest1.umbracoExtensions.helpers

@{

    var ms = ApplicationContext.Current.Services.MediaService;
    var img = ms.GetById(int.Parse(CurrentPage.Image));
}

<h1>Umbraco on Azure is getting there!</h1>
<p>@img.Name</p>
<img alt="@img.Name" src="@CDNImage.ConvertUrlToCDN(img.GetValue("umbracoFile").ToString())" />
@继承Umbraco.Web.Mvc.UmbracoTemplatePage
@{
Layout=“BasePage.cshtml”;
}
@使用utest1.umbracoExtensions.helpers
@{
var ms=ApplicationContext.Current.Services.MediaService;
var img=ms.GetById(int.Parse(CurrentPage.Image));
}
Azure上的Umbraco正在到达那里!
@姓名

欢迎提出改进建议


啊哈,回馈的感觉真好:)

Nugget,请您分享一下您的解决方案好吗?@Steve,不知道我怎么会错过这么久以前的回复。但是为了其他人的利益,我放弃了使用FileSystemProvider,因为我发现媒体上传控件无论如何都没有使用这个类进行文件操作!使用Azure网站(具有永久共享磁盘)时,您可以挂接到MediaService.Saved方法并从那里复制到Azure存储。我还连接了MediaService.Deleted事件,但发现它在我安装的v6.1.6上没有启动。因此,我改用了垃圾事件,这意味着编辑们需要重新上传一个垃圾项目。Nugget,你能分享一下你的解决方案吗?@Steve,我不知道我怎么会错过这么久以前的回复。但是为了其他人的利益,我放弃了使用FileSystemProvider,因为我发现媒体上传控件无论如何都没有使用这个类进行文件操作!使用Azure网站(具有永久共享磁盘)时,您可以挂接到MediaService.Saved方法并从那里复制到Azure存储。我还连接了MediaService.Deleted事件,但发现它在我安装的v6.1.6上没有启动。因此,我使用了垃圾事件,这意味着编辑需要重新上传,如果他们垃圾项目。
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{
    Layout = "BasePage.cshtml";
}

@using utest1.umbracoExtensions.helpers

@{

    var ms = ApplicationContext.Current.Services.MediaService;
    var img = ms.GetById(int.Parse(CurrentPage.Image));
}

<h1>Umbraco on Azure is getting there!</h1>
<p>@img.Name</p>
<img alt="@img.Name" src="@CDNImage.ConvertUrlToCDN(img.GetValue("umbracoFile").ToString())" />