IIS7 - Lỗi vi phạm khóa, trình xử lý HTTP, mô-đun và phần tử <Clear />


18

Tôi có một trang web ASP.NET sử dụng bộ trình xử lý HTTP riêng và không cần bất kỳ mô-đun nào.

Vì vậy, trong IIS6, tất cả những gì tôi phải làm là điều này trong web.config:

<httpModules>
    <clear />
</httpModules>

Tuy nhiên, nếu tôi cố gắng thực hiện tương tự trong system.webServerkhu vực cho IIS7, tôi gặp lỗi 500 khi cố gắng xem trang web và trong trình quản lý IIS khi tôi cố gắng xem ánh xạ trình xử lý, tôi nhận được một hộp bật lên với thông báo:

Có lỗi trong khi thực hiện thao tác này

Chi tiết:

Tên tệp:

\? \ C: \ Trang web \ TheWebSiteGoesHere \ web.config

Số dòng: 39

Lỗi: Khóa vi phạm

Dòng 39 là nơi chứa <clear />phần tử.

Một số googling dẫn tôi đến một giải pháp liên quan đến việc chạy lệnh này:

%windir%\system32\inetsrv\appcmd.exe unlock config -section:system.webServer/modules

... nhưng điều đó không giải quyết được vấn đề.

Câu trả lời:


11

Đó là do thiết kế. Phần của system.webServer về cơ bản xác định IIS. Nếu bạn, bạn sẽ không còn lại bất cứ điều gì. Trong apphost.config, bạn sẽ có một cái gì đó như thế này:

        <modules>
            <add name="HttpCacheModule" lockItem="true" />
            <add name="DynamicCompressionModule" lockItem="true" />
            <add name="StaticCompressionModule" lockItem="true" />
            <add name="DefaultDocumentModule" lockItem="true" />
            <add name="DirectoryListingModule" lockItem="true" />
            <add name="IsapiFilterModule" lockItem="true" />
            <add name="ProtocolSupportModule" lockItem="true" />
            <add name="HttpRedirectionModule" lockItem="true" />
            <add name="StaticFileModule" lockItem="true" />
            ...

Lưu ý các thuộc tính lockItem. Bởi vì có từ 1 khóa trở lên, sẽ vi phạm khóa.

Vì vậy, bạn chỉ cần xóa cụ thể các mục mà bạn không muốn khỏi web.config hoặc nếu bạn thực sự cần xóa tất cả chúng và thêm lại các mục của riêng bạn, sau đó trong applicationhost.config xóa lockItem = "true" trên từng yếu tố đó và đảm bảo thêm lại chúng để máy chủ web của bạn thực sự hoạt động.

Biên tập

(Đã thêm thông tin từ Daniel, theo yêu cầu của anh ấy. (Scott))

Đây là những gì tôi đã làm dựa trên những gì Scott nói:

Đã mở applicationhost.config trong% Windir% \ system32 \ inetsrv \ config. Lưu ý rằng trong Windows Server 2008 64 bit, bạn sẽ cần chỉnh sửa tệp bằng trình chỉnh sửa 64 bit (Notepad gốc sẽ làm được, nhưng Notepad ++ sẽ không thể tìm thấy tệp). Xem ở đây để biết thêm thông tin về điều này.

Trong phần tử, thay đổi thuộc tính lockItem trên tất cả các mô-đun thành false.

Trong tệp web.config của ứng dụng web của tôi, sau đó có thể thực hiện các thao tác sau:

<system.webServer>
   <modules>
      <clear />
   </modules>
</system.webServer>

Tất nhiên, như Scott chỉ ra, điều này có nghĩa là không còn máy chủ web, vì vậy đây là bộ mô-đun tối thiểu tôi cần để công cụ của tôi chạy lại (YMMV):

<add name="HttpRedirectionModule" lockItem="false" />

<add name="StaticFileModule" lockItem="false" />

<add name="CustomLoggingModule" lockItem="false" />

<add name="CustomErrorModule" lockItem="false" />

<add name="IsapiModule" lockItem="false" />

<add name="AnonymousAuthenticationModule" lockItem="false" />

Ngoài ra, cho bất cứ ai quan tâm, đây là cốt truyện là tại sao tôi đang làm điều này.


2

Scott, bạn có thể nối nó vào câu trả lời của bạn không?

Đây là những gì tôi đã làm dựa trên những gì Scott nói:

  1. Mở applicationHost.configtrong %windir%\system32\inetsrv\config. Lưu ý rằng trong Windows Server 2008 64 bit, bạn sẽ cần chỉnh sửa tệp bằng trình chỉnh sửa 64 bit (Notepad gốc sẽ làm được, nhưng Notepad ++ sẽ không thể tìm thấy tệp). Xem ở đây để biết thêm thông tin về điều này.

  2. Trong <system.webServer>phần tử, thay đổi lockItemthuộc tính trên tất cả các mô-đun thành false.

  3. Trong tệp web.config của ứng dụng web của tôi, sau đó có thể thực hiện các thao tác sau:

    <system.webServer>
       <modules>
          <clear />
       </modules>
    </system.webServer>
    
  4. Tất nhiên, như Scott chỉ ra, điều này có nghĩa là không còn máy chủ web, vì vậy đây là bộ mô-đun tối thiểu tôi cần để chạy lại công cụ của mình (YMMV):

    <add name="HttpRedirectionModule" lockItem="false" />

    <add name="StaticFileModule" lockItem="false" />

    <add name="CustomLoggingModule" lockItem="false" />

    <add name="CustomErrorModule" lockItem="false" />

    <add name="IsapiModule" lockItem="false" />

    <add name="AnonymousAuthenticationModule" lockItem="false" />

Ngoài ra, đối với bất kỳ ai quan tâm, đây là lý do tại sao tôi làm việc này .


Xin lỗi về định dạng trên bit cuối cùng đó ... vì một số lý do, nó sẽ không hiển thị ở định dạng "mã" thông thường.
Daniel Schaffer

Điều chắc chắn. Chỉ cần thêm nó.
Scott Forsyth - MVP

2

Tôi hy vọng nó không quá muộn để giúp đỡ.

Tôi đã gặp sự cố này ngày hôm nay và khắc phục sự cố chỉnh sửa sau nút Applicationhost.Config XML:

httpErrors lockAttribut = "allowAbsolutePathsWhenDelegated, defaultPath"

Xóa ", defaultPath" và khởi động lại IIS của bạn (iisreset).

Tôi hy vọng nó hữu ích.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.