2013-04-23 28 views
9

Tôi đang sử dụng dịch vụ Microsoft Web Deploy Remote Agent để cho phép tôi dễ dàng xuất bản mã lên máy chủ từ trong Visual Studio.Triển khai Web không thành công do tệp đang sử dụng

Trang web tôi đang triển khai đang sử dụng log4net để ghi nhật ký vào tệp nhật ký và mỗi khi tôi cố triển khai phiên bản mã mới, tôi gặp lỗi này trong Visual Studio cho biết tệp nhật ký log4net hiện tại sử dụng:

Đã xảy ra lỗi khi yêu cầu được xử lý trên máy tính từ xa . Tệp 'Web.log' đang được sử dụng.

Quá trình không thể truy cập 'C: \ inetpub \ wwwroot \ Logs \ Web.log' bởi vì nó đang được sử dụng bởi một quy trình khác.

tôi có thể giải quyết điều này bằng cách vào máy chủ và làm một iisreset trước khi xuất bản ... nhưng đó là loại đánh bại các điểm xuất bản 'dễ dàng' từ Visual Studio :)

Có một số cách Tôi có thể nhận nhiệm vụ xuất bản để phát hành một iisreset tự động, hoặc một số cách khác tôi có thể làm việc vòng này?

+0

Đây có phải là tệp nhật ký log4Net của bạn không? – Tommy

+0

@Tommy Có, xin lỗi, tôi nên làm cho rõ ràng hơn :) – Cocowalla

+0

Tôi tự hỏi nếu bạn có thể buộc vào sự kiện Application_End trong global.asax của bạn và gọi tắt tùy chọn cho log4Net. Điều này sẽ giải phóng khóa trên tệp. Tôi đã không phải làm điều này, do đó không được đăng như một câu trả lời, nhưng có một vài câu hỏi SO và các mục khác liên quan đến việc tắt dịch vụ ghi nhật ký vì nhiều lý do khác. – Tommy

Trả lời

9

Tôi tiếp tục tìm kiếm và tìm thấy một số mẩu tin nhỏ xung quanh tệp đang bị khóa trong một vài diễn đàn khác. Bạn đã thử thêm

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 

vào phần tử <appender> trong tệp web.config? Từ số Apache docs

Mở tệp một lần cho mỗi chu kỳ AcquireLock/ReleaseLock, do đó giữ khóa trong khoảng thời gian tối thiểu. Phương pháp này khóa chậm hơn đáng kể so với FileAppender.ExclusiveLock nhưng cho phép các quá trình khác di chuyển/xóa tệp nhật ký trong khi ghi lại tiếp tục.

Theo như hiệu suất cân nhắc, tôi cho rằng bạn sẽ cần kiểm tra xem điều này có ảnh hưởng đến bạn hay không. hiệu suất tác động. Tôi không thể tin rằng việc nhận/giải phóng khóa có thể mất tất cả nhiều thời gian.

6

Có một số MSDEPLOY provider called recycleApp được sử dụng chính xác cho việc này. Bạn có thể bao gồm điều này trong tệp kê khai triển khai của mình.

Một tùy chọn khác là sử dụng cờ ignoreOnErrors sẽ bỏ qua tệp đang sử dụng và tiếp tục triển khai.

+0

Bạn có thể cung cấp một số thông tin về recycleApp và cách thực sự bao gồm điều này không?Tôi không thấy bất kỳ tùy chọn trong Visual Studio, tương tự cho ignoreOnErrors cờ – Cocowalla

+0

Bạn có thể chạy lệnh này theo cách thủ công như một bước triển khai trước hoặc tự động bằng cách sử dụng bước triển khai VS - kiểm tra ['AfterTargets =" CopyAllFilesToSingleFolderForPackage "'] (http: //stackoverflow.com/a/12579589). Chưa có một tùy chọn trong VS để cho nó tái chế các ứng dụng - chỉ tập tin + tùy chọn xuất bản SQL. – SliverNinja

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