2012-02-20 25 views
7

Tôi đang phát triển và ứng dụng trong ASP.NET MVC3. Tôi đang lên kế hoạch tận dụng lợi thế của Amazon Cloud cung cấp như một CDN để phục vụ tài sản tĩnh.Cách tốt nhất để chuyển đổi giữa tài sản tĩnh và tài sản dựa trên CDN để phát triển và triển khai

Tôi tò mò liệu có ai đã nghĩ ra một phương pháp đơn giản để chuyển đổi giữa các tài sản cục bộ để phát triển và các tài sản dựa trên CDN để triển khai không?

Mọi mẹo hoặc thủ thuật sẽ được đánh giá cao.

Trả lời

7

Tương tự như câu trả lời của Thánh Phaolô.

Trong quá khứ tôi đã sử dụng một phương pháp mở rộng cho UrlHelper đã tạo liên kết dựa trên giá trị từ web.config.

Điều này hữu ích vì vậy bạn không cần phải thu nhỏ lượt xem của mình sau khi xuất bản và đơn giản như cập nhật mục nhập web.config khi xuất bản.Bất kỳ nguồn lực mà yêu cầu sử dụng tài nguyên CDN, bạn chỉ cần nói Url.CdnContent("~/site.css")

Tôi không phải trên pc phát triển của tôi vào lúc này, nhưng khi tôi về nhà, tôi sẽ giúp bạn có được nguồn cho phương pháp khuyến nông của tôi

Nó rất đơn giản, nhưng nó hoạt động cho những gì tôi cần để làm

public static string CdnContent(this UrlHelper helper, string relativePath) 
{ 
    var cdnRoot = ConfigurationManager.AppSettings["cygnus.cdnroot"]; 
    if (string.IsNullOrEmpty(cdnRoot)) 
     return UrlHelper.GenerateContentUrl(relativePath, helper.RequestContext.HttpContext); 

    if (relativePath.StartsWith("~")) 
     relativePath = relativePath.Substring(1); 

    if (cdnRoot.EndsWith("/")) 
     cdnRoot = cdnRoot.Substring(0, cdnRoot.Length - 1); 

    if (!relativePath.StartsWith("/")) 
     relativePath = "/" + relativePath; 

    return cdnRoot + relativePath; 
} 
+0

Điều đó thật tuyệt vời. Cảm ơn bạn. – stephen776

+0

@ stephen776, câu trả lời được cập nhật với phương pháp mở rộng –

+0

@ stephen776 nếu bạn nhìn vào mã nguồn, nó được thiết lập để hoạt động mà không có giá trị web.config. Tôi bỏ qua các ứng dụng cdnroot khi tôi đang phát triển tại địa phương, sau đó có biến đổi cấu hình web của tôi thêm nó vào lúc xây dựng. –

4

tôi đã thực hiện nó trong quá khứ bằng cách sử dụng một vài quy tắc đơn giản:

  • Luôn luôn sử dụng tập tin đường dẫn tương đối trong CSS
  • Luôn luôn sử dụng một mô hình tiêu chuẩn để tham khảo nội dung trong quan điểm của bạn (tôi sử dụng ứng dụng tương đối đường dẫn với Url.Content, tức là Url.Content("~/content/file.jpg"))
  • Không tham chiếu tệp trong JavaScript.

Sau đó, trong quá trình triển khai của tôi, tôi chỉ có thể sao chép toàn bộ tài sản tĩnh từ các trang web để CDN, CSS sẽ chỉ làm việc kể từ khi người thân của mình (CSS url() giá trị luôn luôn liên quan đến các tập tin CSS họ đang ở, không phải là yêu cầu), và tôi sẽ sử dụng regex để thay thế bất kỳ chuỗi nào trong chế độ xem của tôi ở dạng tôi mong muốn có đường dẫn cơ sở CDN.

2

Câu hỏi hay. Tôi khuyên bạn nên sử dụng Biến biên dịch có điều kiện.

Nếu dự án của bạn ở chế độ gỡ lỗi gỡ lỗi, nội dung cục bộ sẽ được liên kết. Nếu dự án của bạn ở chế độ phát hành , nội dung CDN sẽ được liên kết.

Đây là một mẫu:

<head runat="server"> 
    <% #if DEBUG %> 
     <link rel="stylesheet" type="text/css" href="/Assets/Styles/Default.css" /> 
    <% #else %> 
     <link rel="stylesheet" type="text/css" href="http://cdn.mysite.com/Assets/Styles/Default.css" /> 
    <% #endif %> 
</head> 

Nhưng hãy cẩn thận, khi bạn xuất bản bạn dự, nó phải ở trong chế độ phát hành . Một lần, tôi đã cập nhật một trong các dự án của mình và nó đã ở chế độ DEBUG và mọi thứ đều sai.

Dưới đây là một số liên kết tốt đẹp về Compilation Conditional:

http://haacked.com/archive/2007/09/16/conditional-compilation-constants-and-asp.net.aspx

http://odetocode.com/blogs/scott/archive/2005/12/01/conditional-compilation-in-asp-net-2-0.aspx

http://odetocode.com/blogs/scott/archive/2007/09/24/more-on-conditional-compilation-in-asp-net.aspx

+0

Điều này có vẻ đơn giản. Cảm ơn bạn về thông tin. Tôi sẽ kiểm tra tất cả các liên kết – stephen776

+0

@ stephen776: Tôi rất vui vì nó đã giúp :) –

1

Tôi có một tập hợp các phương pháp mở rộng tôi sử dụng (xem bên dưới). Bạn có thể sử dụng chúng làm cơ sở/ví dụ để tạo các phương pháp mở rộng/gỡ lỗi tùy chỉnh của riêng bạn.

chung debug/release:

public static MvcHtmlString DebugReleaseString(this System.Web.Mvc.HtmlHelper html, string debugString, string releaseString) 
{ 
    string toReturn = debugString; 
#if !DEBUG 
    if (!string.IsNullOrEmpty(releaseString)) 
     toReturn = releaseString; 
#endif 
    return MvcHtmlString.Create(toReturn); 
} 

chung sử dụng debug/release:

@Html.DebugReleaseString("/images/myimage.jpg", "http://mycdn.com/images/myimage.jpg") 

gỡ lỗi thẻ/release CSS:

public static MvcHtmlString CssTag(this System.Web.Mvc.HtmlHelper html, string fileName) 
{ 
    return html.CssTag(fileName, string.Empty); 
} 

public static MvcHtmlString CssTag(this System.Web.Mvc.HtmlHelper html, string fileName, string releaseFileName) 
{ 
    if (string.IsNullOrEmpty(fileName)) 
     throw new ArgumentNullException("fileName"); 

    string cssTag = string.Format(
     "<link rel=\"stylesheet\" type=\"text/css\" href=\"{0}\" />", 
     html.MeDebugReleaseString(fileName, releaseFileName)); 

    return MvcHtmlString.Create(cssTag); 
} 

Debug/phát hành thẻ CSS sử dụng:

@Html.CssTag("/styles/mystyle.css") 
@Html.CssTag("/styles/mystyle.css", "http://mycdn.com/styles/mystyle.css") 

Debug/phát hành thẻ JS:

public static MvcHtmlString JavascriptTag(this System.Web.Mvc.HtmlHelper html, string fileName) 
{ 
    return html.JavascriptTag(fileName, string.Empty); 
} 

public static MvcHtmlString JavascriptTag(this System.Web.Mvc.HtmlHelper html, string fileName, string releaseFileName) 
{ 
    if (string.IsNullOrEmpty(fileName)) 
     throw new ArgumentNullException("fileName"); 

    string jsTag = string.Format("<script type=\"text/javascript\" src=\"{0}\"></script>", 
           html.MeDebugReleaseString(fileName, releaseFileName)); 

    return MvcHtmlString.Create(jsTag); 
} 

Debug/phát hành JS thẻ sử dụng:

@Html.JavascriptTag("/scripts/myscript.css") 
@Html.JavascriptTag("/scripts/myscript.css", "http://mycdn.com/scripts/myscript.js") 

bổ sung tùy chọn debug/release:

public enum RenderModeEnum 
{ 
    Debug, 
    Release, 
    DebugAndRelease 
} 

public static MvcHtmlString CssTag(this System.Web.Mvc.HtmlHelper html, string fileName, RenderModeEnum tagRenderMode) 
{ 
    if (tagRenderMode == RenderModeEnum.DebugAndRelease) 
     return html.CssTag(fileName); 

#if DEBUG 
    if (tagRenderMode == RenderModeEnum.Debug) 
     return html.CssTag(fileName); 
#else 
    if (tagRenderMode == RenderModeEnum.Release) 
     return html.CssTag(fileName); 
#endif 

    return MvcHtmlString.Empty; 
} 

public static MvcHtmlString JavascriptTag(this System.Web.Mvc.HtmlHelper html, string fileName, RenderModeEnum tagRenderMode) 
{ 
    if (tagRenderMode == RenderModeEnum.DebugAndRelease) 
     return html.JavascriptTag(fileName); 

#if DEBUG 
    if (tagRenderMode == RenderModeEnum.Debug) 
     return html.JavascriptTag(fileName); 
#else 
    if (tagRenderMode == RenderModeEnum.Release) 
     return html.JavascriptTag(fileName); 
#endif 

    return MvcHtmlString.Empty; 
} 

bổ sung debug/release tùy chọn sử dụng:

@Html.CssTag("/styles/mystyle.css", RenderModeEnum.DebugAndRelease) 
@Html.CssTag("/styles/mystyle.css", RenderModeEnum.Debug) 
@Html.CssTag("http://mycdn.com/styles/mystyle.css", RenderModeEnum.Release) 
Các vấn đề liên quan