번들 및 축소된 파일을 Windows Azure CDN에 업로드하는 방법
ASP를 사용하고 있습니다.NET MVC 4 번들링 및 네임스페이스 기능(예:@Styles.Render("~/content/static/css")
).
Windows Azure CDN과 함께 사용하고 싶습니다.
나는 관습을 쓰는 것을 조사했습니다.BundleTransform
하지만 아직 콘텐츠가 최적화되지 않았습니다.
런타임에 최적화된 스트림을 구문 분석하고 업로드하는 것에 대해서도 알아봤지만, 그것은 나에게 해킹처럼 느껴지고 나는 그것을 별로 좋아하지 않습니다.
@StylesCdn.Render(Url.AbsoluteContent(
Styles.Url("~/content/static/css").ToString()
));
public static IHtmlString Render(string absolutePath)
{
// get the version hash
string versionHash = HttpUtility.ParseQueryString(
new Uri(absolutePath).Query
).Get("v");
// only parse and upload to CDN if version hash is different
if (versionHash != _versionHash)
{
_versionHash = versionHash;
WebClient client = new WebClient();
Stream stream = client.OpenRead(absolutePath);
UploadStreamToAzureCdn(stream);
}
var styleSheetLink = String.Format(
"<link href=\"{0}://{1}/{2}/{3}?v={4}\" rel=\"stylesheet\" type=\"text/css\" />",
cdnEndpointProtocol, cdnEndpointUrl, cdnContainer, cdnCssFileName, versionHash
);
return new HtmlString(styleSheetLink);
}
번들 및 미니 버전을 Windows Azure CDN에 자동으로 업로드하려면 어떻게 해야 합니까?
Hao의 조언에 따라 나는 확장 번들과 번들 변환을 수행합니다.
번들에 AzureScriptBundle 또는 AzureStyleBundle 추가;
bundles.Add(new AzureScriptBundle("~/bundles/modernizr.js", "cdn").Include("~/Scripts/vendor/modernizr.custom.68789.js"));
결과:
<script src="//127.0.0.1:10000/devstoreaccount1/cdn/modernizr.js?v=g-XPguHFgwIb6tGNcnvnI_VY_ljCYf2BDp_NS5X7sAo1"></script>
CdnHost가 설정되지 않은 경우 CDN 대신 BLOB의 URI를 사용합니다.
학급
using System;
using System.Text;
using System.Web;
using System.Web.Optimization;
using System.Security.Cryptography;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.StorageClient;
namespace SiegeEngineWebRole.BundleExtentions
{
public class AzureScriptBundle : Bundle
{
public AzureScriptBundle(string virtualPath, string containerName, string cdnHost = "")
: base(virtualPath, null, new IBundleTransform[] { new JsMinify(), new AzureBlobUpload { ContainerName = containerName, CdnHost = cdnHost } })
{
ConcatenationToken = ";";
}
}
public class AzureStyleBundle : Bundle
{
public AzureStyleBundle(string virtualPath, string containerName, string cdnHost = "")
: base(virtualPath, null, new IBundleTransform[] { new CssMinify(), new AzureBlobUpload { ContainerName = containerName, CdnHost = cdnHost } })
{
}
}
public class AzureBlobUpload : IBundleTransform
{
public string ContainerName { get; set; }
public string CdnHost { get; set; }
static AzureBlobUpload()
{
}
public virtual void Process(BundleContext context, BundleResponse response)
{
var file = VirtualPathUtility.GetFileName(context.BundleVirtualPath);
if (!context.BundleCollection.UseCdn)
{
return;
}
if (string.IsNullOrWhiteSpace(ContainerName))
{
throw new Exception("ContainerName Not Set");
}
var conn = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("DataConnectionString"));
var blob = conn.CreateCloudBlobClient()
.GetContainerReference(ContainerName)
.GetBlobReference(file);
blob.Properties.ContentType = response.ContentType;
blob.UploadText(response.Content);
var uri = string.IsNullOrWhiteSpace(CdnHost) ? blob.Uri.AbsoluteUri.Replace("http:", "").Replace("https:", "") : string.Format("//{0}/{1}/{2}", CdnHost, ContainerName, file);
using (var hashAlgorithm = CreateHashAlgorithm())
{
var hash = HttpServerUtility.UrlTokenEncode(hashAlgorithm.ComputeHash(Encoding.Unicode.GetBytes(response.Content)));
context.BundleCollection.GetBundleFor(context.BundleVirtualPath).CdnPath = string.Format("{0}?v={1}", uri, hash);
}
}
private static SHA256 CreateHashAlgorithm()
{
if (CryptoConfig.AllowOnlyFipsAlgorithms)
{
return new SHA256CryptoServiceProvider();
}
return new SHA256Managed();
}
}
}
그래서 현재로서는 이것을 할 수 있는 좋은 방법이 없습니다.우리가 예상하는 장기적인 워크플로우는 빌드 타임 번들링 지원을 추가하는 것입니다.그런 다음 빌드 태스크를 실행(또는 원하는 경우 exe를 실행)하여 번들을 생성한 다음 이러한 번들을 Azure CDN에 업로드할 수 있습니다.마지막으로 번들 컬렉션에서 CDN 사용을 설정하기만 하면 스크립트/스타일 도우미가 로컬 번들에 대한 적절한 폴백을 통해 Azure CDN에 대한 링크를 렌더링하는 방식으로 자동 전환됩니다.
단기적으로, 당신이 하려는 것은 번들이 처음 구축될 때 당신의 번들을 Azure CDN에 업로드하는 것이라고 생각합니다.
BundleTransform은 이를 위한 한 가지 방법입니다. 약간 번거롭지만 BundleTransform을 마지막으로 추가할 수 있습니다.마지막 이후로 번들 응답입니다.컨텐츠는 효과적으로 최종 번들 응답입니다.그 시점에서 CDN에 업로드할 수 있습니다. 그게 말이 됩니까?
오리진 도메인을 Azure의 웹 사이트로 정의할 수 있습니다(이것은 아마도 원래 질문 이후에 추가되었을 것입니다).
CDN 끝점이 있는 경우 해당 끝점에 대해 쿼리 문자열을 허용해야 하며 CDN을 통해 번들을 직접 참조할 수 있습니다.
<link href="//az888888.vo.msecnd.net/Content/css-common?v=ioYVnAg-Q3qYl3Pmki-qdKwT20ESkdREhi4DsEehwCY1" rel="stylesheet"/>
CDN 호스트 이름을 추가하기 위해 이 도우미를 만들었습니다.
public static IHtmlString RenderScript(string virtualPath)
{
if (HttpContext.Current.IsDebuggingEnabled)
return Scripts.Render(virtualPath);
else
return new HtmlString(String.Format(
CultureInfo.InvariantCulture,
Scripts.DefaultTagFormat,
"//CDN_HOST" + Scripts.Url(virtualPath).ToHtmlString()));
}
@manishKungwani는 이전 코멘트에서 요청했습니다.UseCdn을 설정한 다음 cdnHost 오버로드를 사용하여 번들을 생성합니다.저는 이것을 AWS CloudFront 도메인(xxx.cloudfront.net )에 넣는 데 사용했지만, 나중에 생각해 보면 다른 CDN 공급자와 함께 사용하기 위해 좀 더 일반적으로 이름을 붙였어야 했습니다.
public class CloudFrontScriptBundle : Bundle
{
public CloudFrontScriptBundle(string virtualPath, string cdnHost = "")
: base(virtualPath, null, new IBundleTransform[] { new JsMinify(), new CloudFrontBundleTransformer { CdnHost = cdnHost } })
{
ConcatenationToken = ";";
}
}
public class CloudFrontStyleBundle : Bundle
{
public CloudFrontStyleBundle(string virtualPath, string cdnHost = "")
: base(virtualPath, null, new IBundleTransform[] { new CssMinify(), new CloudFrontBundleTransformer { CdnHost = cdnHost } })
{
}
}
public class CloudFrontBundleTransformer : IBundleTransform
{
public string CdnHost { get; set; }
static CloudFrontBundleTransformer()
{
}
public virtual void Process(BundleContext context, BundleResponse response)
{
if (context.BundleCollection.UseCdn && !String.IsNullOrWhiteSpace(CdnHost))
{
var virtualFileName = VirtualPathUtility.GetFileName(context.BundleVirtualPath);
var virtualDirectory = VirtualPathUtility.GetDirectory(context.BundleVirtualPath);
if (!String.IsNullOrEmpty(virtualDirectory))
virtualDirectory = virtualDirectory.Trim('~');
var uri = string.Format("//{0}{1}{2}", CdnHost, virtualDirectory, virtualFileName);
using (var hashAlgorithm = CreateHashAlgorithm())
{
var hash = HttpServerUtility.UrlTokenEncode(hashAlgorithm.ComputeHash(Encoding.Unicode.GetBytes(response.Content)));
context.BundleCollection.GetBundleFor(context.BundleVirtualPath).CdnPath = string.Format("{0}?v={1}", uri, hash);
}
}
}
private static SHA256 CreateHashAlgorithm()
{
if (CryptoConfig.AllowOnlyFipsAlgorithms)
{
return new SHA256CryptoServiceProvider();
}
return new SHA256Managed();
}
}
언급URL : https://stackoverflow.com/questions/12047981/how-to-upload-bundled-and-minified-files-to-windows-azure-cdn
'programing' 카테고리의 다른 글
Visual Studio 2015 추가 디버그 옵션 사용 안 함 (0) | 2023.04.26 |
---|---|
PowerShell에서 DateTime을 포맷하는 방법 (0) | 2023.04.26 |
Linkq에서 문자열을 엔티티로 변환하는 데 문제가 있습니다. (0) | 2023.04.26 |
Excel을 데이터 테이블로 신속하게 가져오기 (0) | 2023.04.26 |
Angular2 - 라디오 버튼 바인딩 (0) | 2023.04.26 |