2017-09-05 40 views
24

Tôi đã tạo một trang web góc có chứa biểu mẫu "thêm" và "xóa" để thao tác dữ liệu trên một bảng trên cùng một trang.Góc không cập nhật trang với bộ nhớ cache được bật

Khi tôi thử nghiệm cục bộ hoặc với Chrome Dev Console (bộ nhớ cache bị tắt), khi tôi thêm một mục mới hoặc xóa một mục, bảng sẽ tự động làm mới. Khi tôi kiểm tra nó trên máy chủ sản xuất (IIS Server) của khách hàng của tôi, nó chỉ hoạt động với Chrome Dev Console được mở. Nếu không, họ phải sử dụng CTRL + F5 để làm mới bộ nhớ cache và hiển thị các thay đổi trên trang.

Đây là mã vào các thành phần:

addProduct() { 
    this._productsService.addProduct(this.addFormProductItem) 
     .subscribe(v => { 
     this._productsService.getProducts().subscribe( 
      products => {this.products = products, this.onChangeTable(this.config)} 
    ); 
    }); 
    this.addmodalWindow.hide(); 
    return; 
    } 


    onChangeTable(config: any, page: any = { 
    page: this.page, 
    itemsPerPage: this.itemsPerPage 
    }): any { 
    if (config.filtering) { 
     Object.assign(this.config.filtering, config.filtering); 
    } 
    if (config.sorting) { 
     Object.assign(this.config.sorting, config.sorting); 
    } 
    this.ng2TableData = this.products; 
    this.length = this.ng2TableData.length; 
    let filteredData = this.changeFilter(this.ng2TableData, this.config); 
    let sortedData = this.changeSort(filteredData, this.config); 
    this.rows = page && config.paging ? this.changePage(page, sortedData) : sortedData; 
    this.length = sortedData.length; 
    } 

tôi đoán là nó là một trong hai liên quan đến một số cấu hình máy chủ hoặc vào mã webpack. Tuy nhiên, tôi không quen thuộc với thứ hai và tôi chỉ còn lại nó như nó đã được trên gói khởi đầu tôi sử dụng.

Tôi tạo ra a gist with the webpack vì nó là một tập tin dài

Sửa 1: Sau khi một số nghiên cứu thêm, tôi cố gắng thêm những điều sau đây trên một tập tin web.config trên thư mục gốc của ứng dụng.

<caching enabled="false" enableKernelCache="false"> 
     <profiles> 
     <add extension=".css" policy="DontCache" kernelCachePolicy="DontCache" /> 
     <add extension=".html" policy="DontCache" kernelCachePolicy="DontCache" /> 
     <add extension=".js" policy="DontCache" kernelCachePolicy="DontCache" /> 
     </profiles> 
</caching> 

Tuy nhiên, tôi vẫn có hành vi tương tự. Thêm một mục với Dev Console đã đóng, nó không cập nhật bảng. Nhưng nếu tôi có bàn điều khiển dev mở và tắt bộ nhớ cache, sau đó nó cập nhật nó mà không cần làm mới.

Chỉnh sửa 2: Làm việc trên Cửa sổ ẩn danh không khắc phục được sự cố.

Chỉnh sửa 3: Thêm thẻ meta trên index.html không khắc phục được sự cố.

<meta http-equiv="Cache-control" content="no-cache, no-store, must-revalidate"> 
<meta http-equiv="Pragma" content="no-cache"> 

Sửa 4:

getProducts() { 
    return this._http.get(this.API + '/products/all') 
     .map((response: Response) => <Product[]>response.json().products); 
    } 

    addProduct(product:Product) { 
    if (this._loggedInGuard.isLoggedIn()) { 
     let token = localStorage.getItem('my.token'); 
     let body = JSON.stringify(product); 
     let headers = new Headers(
     { 'Content-Type': 'application/json', 
     'Authorization': 'Bearer ' + token}); 
     return this._http 
     .post(this.API + "/products/store", body, {headers: headers}) 
     .map(res => res.json()) 
     .catch(this._responseService.catchBadResponse) 
     .do(() => this._responseService.success('Success. You added a product!')); 

    } 
    } 

Sửa 5

Giải pháp duy nhất tôi có thể tìm thấy là để tải lại cửa sổ mỗi khi tôi làm một bản cập nhật trên dữ liệu với location.reload(true). Nhưng một lần nữa, điều này chỉ hoạt động trên Firefox chứ không phải trên Chrome. Và tôi sẽ không chấp nhận rằng bạn phải từ bỏ lý do duy nhất để có một Ứng dụng Trang đơn để thực hiện công việc này.

+0

Bạn có thể hiển thị 'getProducts()' và 'addProduct()' từ dịch vụ của mình không. Ngoài ra, điều gì sẽ xảy ra khi bạn gọi 'addProduct' trong thành phần của bạn hai lần? –

+0

Đã cập nhật câu hỏi ... Không quan trọng bao nhiêu lần tôi thêm sản phẩm. Bảng vẫn giữ nguyên trừ khi tôi mở Dev Console hoặc xóa bộ nhớ cache và làm mới. – Tasos

+0

Cả hai yêu cầu đều được thực hiện? –

Trả lời

5

Có những lý do cụ thể mà không có điều nào bạn đã thử khắc phục sự cố.

Trước hết, sử dụng phần tử <caching> trong web.config không hướng dẫn trình duyệt về cách lưu bộ nhớ cache phản hồi. Nó được sử dụng để cấu hình cách máy chủ IIS lưu trữ phản hồi để nó có thể được sử dụng lại trong các yêu cầu trong tương lai. Here là tài liệu giải thích điều đó.

Tiếp theo, các thẻ <meta> của bạn. Thông thường, kiểm soát bộ nhớ cache được thực hiện bởi các tiêu đề http thực tế. Mặc dù bạn có thể sử dụng các thẻ <meta> để đặt tiêu đề không được chỉ định trong tiêu đề phản hồi http của bạn, chúng sẽ NOT ghi đè tiêu đề http đã được đặt.IIS có các giá trị mặc định cho bộ nhớ đệm trong các tiêu đề phản hồi, các thẻ <meta> của bạn sẽ không thực sự làm bất cứ điều gì. Các thẻ <meta> thực sự chỉ hữu ích đáng tin cậy khi bạn tải trên một địa chỉ file:///.

Để đạt được những gì bạn đang cố gắng thực hiện một cách đáng tin cậy, bạn cần phải thực sự nhận được máy chủ gửi tiêu đề kiểm soát bộ nhớ cache mà bạn muốn sử dụng. Điều này có thể thay đổi tùy thuộc vào trình duyệt bạn đang cố gắng hỗ trợ, nhưng vì bạn đang sử dụng góc cạnh, tôi có thể giả định rằng bạn đang hỗ trợ các trình duyệt hiện đại, điều này thật đơn giản. Sau đây sẽ vô hiệu hóa bộ nhớ đệm cho TẤT CẢ các tệp tĩnh trong trang web của bạn, có lẽ không chính xác những gì bạn muốn nhưng có thể đóng vai trò như một hướng dẫn.

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <location path="."> 
    <system.webServer> 
     <staticContent> 
     <clientCache cacheControlMode="DisableCache" /> 
     </staticContent> 
    </system.webServer> 
    </location> 
</configuration> 

Tuy nhiên, điều đầu tiên bạn nên làm là kiểm tra các tiêu đề phản hồi hiện tại mà IIS đang gửi cho bạn! Điều này có thể được thực hiện dễ dàng bằng cách sử dụng các công cụ dành cho nhà phát triển Chrome. Nếu bạn nhìn thấy tiêu đề Cache-Control: trong phản hồi, điều này sẽ xác nhận lý do của tôi về lý do tại sao các thẻ <meta> của bạn không hoạt động.

Nếu bạn đang tạo HTML cho ứng dụng góc của bạn không phải với tệp .html tĩnh nhưng thay vào đó tạo nó bằng ASP.NET, đặt cược tốt nhất của bạn là thêm mã vào bộ điều khiển đặt tiêu đề bộ nhớ cache.

Response.Cache.SetCacheability(HttpCacheability.NoCache); 

Nếu bạn muốn hỗ trợ các trình duyệt cũ hoặc bị hỏng nhiều, có những nguồn tài nguyên khác trên mạng mà mô tả những gì tiêu đề có thêm bạn sẽ cần phải thêm, mà lại có thể được thực hiện bằng web.config hoặc ASP.NET mã. Tôi chỉ muốn lặp lại: Nếu bạn vẫn gặp sự cố, hãy chắc chắn rằng bạn đang xem tiêu đề phản hồi được máy chủ gửi.

2

Đối với các trang ASP.NET bạn không muốn lưu trữ bất cứ nơi nào,

HttpContext.Current.Response.Cache.SetCacheability 
          (HttpCacheability.Server); 
HttpContext.Current.Response.Cache.SetNoStore(); 
Response.Cache.SetExpires(DateTime.Now); 
Response.Cache.SetValidUntilExpires(true); 

này cho bất kỳ máy chủ proxy caching rằng chỉ có server cho phép bộ nhớ cache trang và nói với máy chủ không để cache nó. Hai dòng mã sau yêu cầu trình duyệt không lưu vào bộ nhớ cache. Đoạn mã trên dẫn đến ba tiêu đề sau đây:

Cache-Control:no-cache, no-store 
Pragma:no-cache 
Expires:-1 

Bạn cũng có thể thêm một cái gì đó độc đáo để chuỗi truy vấn để ngăn chặn bộ nhớ đệm của trình duyệt.

.post(this.API + "/products/store?unique=milliseconds", body, {headers: headers}) 
+0

Đó không phải là trang asp.net. Nó chỉ là một máy chủ cửa sổ – Tasos

+0

Phần thứ hai (bài viết()) có thể giải quyết nó cho bạn. –

+0

Tôi đã thêm tiêu đề bạn muốn trong câu trả lời của mình. –

1

Nối tham số có dấu thời gian đầy đủ hoặc id duy nhất cho mọi cuộc gọi http mà bạn không muốn lưu vào bộ nhớ cache. Làm việc như một nhà vô địch. Tôi đã từng có cùng một vấn đề bằng cách sử dụng các mẫu trong Angular. Tôi vừa thêm một máy đánh chặn http và nối thêm một dấu thời gian cho mọi cuộc gọi và vấn đề biến mất.

Các vấn đề liên quan