2010-01-26 31 views
5

Tôi làm theo hướng dẫn tại đây: http://splinter.com.au/blog/?p=156 trong nỗ lực sử dụng phiên bản ODP.NET mới hơn mà không cần cài đặt ứng dụng khách Oracle 11g. Tôi đã theo dõi mọi thứ, cho đến nay, ngoại trừ việc khởi động lại IIS.Oracle oci.dll trong thư mục bin ASP.NET không thể bị xóa/không hoạt động

Tuy nhiên, điều này đã gây ra một số vấn đề và tôi thực sự tò mò là tại sao. Nếu tôi cố gắng sử dụng ODP.NET, tôi gặp một ngoại lệ trống khi kết nối Oracle cố kết nối (ví dụ ConnectExample.Open()).

Nhưng hầu hết tò mò: Tôi không thể xóa oci.dll. Nó nói nó đang được sử dụng. Điều gì có thể được sử dụng dll này? ASP.NET chính xác làm gì với một dll bản địa khi nó nằm trong thư mục Bin? Tôi nghĩ rằng có lẽ đây là một cái gì đó liên quan đến oci.dll, nhưng nếu tôi sử dụng dll trong một thời trang tương tự trong một ứng dụng WinForm máy tính để bàn thì oci.dll không bị khóa, và tôi có thể xóa nó một cách tự do.

Ngoài ra, sau khi tôi đã thử sử dụng nó, System.Data.OracleClient bình thường đã ngừng hoạt động. Nó bây giờ ném một ngoại lệ mà OCIEnvCreate trả về với -1.

Tôi sẽ thử khởi động lại IIS, và hy vọng điều đó sẽ sửa lỗi này, nhưng tôi muốn biết những gì đang xảy ra ở đây (và nếu nó có thể được giải quyết mà không cần khởi động lại IIS). Có ai có ý tưởng gì không?

Edit: Tôi cố gắng khởi động lại IIS và không khắc phục được một điều

Chỉnh sửa # 2: Tôi không nghĩ rằng tôi xây dựng câu hỏi này rất tốt, nhưng đó là do giả định của tôi khởi động lại IIS sẽ làm việc. Bây giờ tôi chỉ cần biết tại sao nó không hoạt động. Trong Googling cho các vấn đề tương tự tôi đã chỉ gặp 2 bài viết diễn đàn mà nói về vấn đề chính xác của tôi: Oracle ODP.NET trả về một ngoại lệ trống khi cố gắng kết nối. Dưới đây là các liên kết đến những:

http://kr.forums.oracle.com/forums/thread.jspa?threadID=632296

http://forums.oracle.com/forums/thread.jspa?threadID=549864

Các liên kết Hàn Quốc trên là thú vị nhất. Họ có một cài đặt đầy đủ dẫn tôi nghi ngờ vấn đề của tôi không phải là với các tập tin hoặc các tập tin bị thiếu. Tôi tự hỏi những gì họ có nghĩa là bởi "máy chủ sản xuất ném ngoại lệ trống nếu một cuộc gọi đến DLL OCI được thực hiện trước khi một ODP có thể được thiết lập"?

Chỉnh sửa/Cập nhật # 3: Chúng tôi có một máy chủ mạng nội bộ ở đây cho bộ phận của chúng tôi mà tôi có thể thử nghiệm vào ngày hôm nay. Tôi đã thêm dll cần thiết vào thư mục Bin và mọi thứ đã làm việc mà không cần phải khởi động lại IIS. Tôi không hỏi. Tôi sẽ thử một số thử nghiệm khác trên máy chủ này để xem liệu tôi có thể sao chép sự cố

Chỉnh sửa # 4 (tiếp tục cuộc phiêu lưu): Tôi xác định rằng oraocci11.dll (C++ giao diện cuộc gọi DLL) là cần thiết ban đầu bởi ASP. NET (hoặc thư viện ODP.NET) để thậm chí tìm thấy các dll khách hàng 11g, sau đó oraocci11.dll dường như không bao giờ được sử dụng một lần nữa và có thể bị xóa. Không chắc chắn điều đó có ý nghĩa gì đối với vấn đề của tôi, nhưng vì nó thêm vào cơ sở tri thức ở đây nên tôi đã đề cập đến nó

Edit # 5: Tôi đã thêm mfc71.dll và msvcr71.dll, 2 tệp hệ thống Windows xử lý C/MFC, vào thư mục Bin khi tôi phát hiện ra chúng cần thiết bởi ODP.NET (hoặc ít nhất, cần thiết bởi máy khách). Điều này, ít nhất, làm mọi thứ ở lại trên lỗi "Khách hàng không tương thích" quen thuộc cũ. Tôi đã loại bỏ 2 tệp DLL đó và chắc chắn rằng nó đã quay trở lại các lỗi giống nhau ở trên. Thêm chúng trở lại không làm cho những lỗi đó biến mất, tuy nhiên, vì vậy tôi sẽ phải thiết lập lại IIS một lần nữa.

+0

ASP.NET sẽ tải Dll khi nó được PInvoked ở đâu đó, Dll sẽ vẫn được tải cho đến khi quá trình ASP.NET được tái chế/khởi động lại. –

Trả lời

1

Đối với tệp DLL, bạn sẽ phải dừng IIS, xóa chúng, sau đó bắt đầu IIS. Điều này là do chúng là DLL gốc, không phải của C# dll. C# 's' bản sao bóng 'tính năng không áp dụng cho dll bản địa, đó là lý do tại sao họ đang bị khóa.

Đối với oracle, tôi đã gửi email cho bạn một số công cụ để thử ... thực sự chúng ta nên cập nhật trang SO này khi bạn tìm thấy một giải pháp.

+0

Cảm ơn, tôi sẽ cố gắng thử các tệp đó. Rất tiếc, tôi không có quyền kiểm soát trực tiếp máy chủ ở đây, do đó, việc yêu cầu những việc này phải được thực hiện. Và thậm chí sau đó, các quy trình chỉ có thể dừng lại sau 5:30 chiều. Ồ, bất kỳ ý tưởng nào về lý do tại sao API Microsoft Oracle ngừng hoạt động? – Bob

+0

Những api oracle này luôn là một chút sờ sờ mà tôi đã tìm thấy ... rất khó để nói. – Chris

2

Thay vì (hoặc cũng như) dừng IIS, dừng dịch vụ xuất bản World Wide Web bằng services.msc và sau đó thực hiện thay đổi của bạn.

Chúng tôi thấy rằng đối với một điều khiển biểu đồ DLL đang được sử dụng bởi ứng dụng asp.net, chỉ dừng IIS là không đủ vì bạn không thể xóa tệp (hoặc dán v.v.). Nhưng khi Dịch vụ xuất bản trên toàn thế giới đã bị ngừng, nó có thể bị xóa hoặc ghi đè ...

+0

Tôi nghĩ rằng 'World Wide Web Publishing Service' chỉ là một từ đồng nghĩa với IIS? – Chris

+0

Có thể bạn đã đúng ... Tôi chắc chắn rằng tôi đã phải ngừng dịch vụ Xuất bản WWW khi dừng IIS sẽ không cho phép thay đổi tệp ... có giá trị xác nhận vì lợi ích của riêng tôi – davidsleeps

+0

đã đặt câu hỏi trên SU http://serverfault.com/questions/107053/is-stopping-iis-the-same-as-stopping-the-world-wide-web-publishing-service – davidsleeps

0

Nếu IIS không phải là quá trình khóa tệp, và bạn thực sự bị kẹt, Unlocker có thể giúp bạn xem thực sự khóa tệp, cũng như giải phóng các khóa đó và xóa tệp một cách mạnh mẽ.

Tải xuống here

2

Trải nghiệm điển hình của Oracle.

Tôi cũng gặp vấn đề tương tự. Unlockers không hoạt động. Tôi đã thử một số - tất cả các báo cáo rằng các tập tin không bị khóa ở tất cả, nhưng sau đó báo cáo rằng họ không thể xóa nó.

Dừng IIS và hầu hết các dịch vụ Windows không phải lõi đều không hoạt động.

Giải pháp là đổi tên tệp, khởi động lại, sau đó xóa tệp. Đối với một số lý do, Windows cho phép bạn đổi tên một tập tin bị khóa và giữ nó bị khóa, nhưng khi khởi động lại nỗ lực để khóa "oci.dll" không thành công vì nó không còn tồn tại dưới tên đó.

0

Có 3 điều tôi biết về điều đó sẽ cho phép bạn xóa này và các file mà là một phần của Oracle Data Access Chủ đầu tư:

1.) Ngừng bơi ứng dụng trong IIS.

2.) Đóng Visual Studio.

3.) Khởi động lại máy.

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