IIS7 - Kesalahan Kunci Pelanggaran, penangan HTTP, modul, dan elemen <clear />

18

Saya memiliki situs ASP.NET yang menggunakan perangkat HTTP handler-nya sendiri dan tidak memerlukan modul apa pun.

Jadi, di IIS6, yang harus saya lakukan adalah ini di web.config saya:

<httpModules>
    <clear />
</httpModules>

Namun, jika saya mencoba melakukan hal yang sama di system.webServerarea untuk IIS7, saya mendapatkan 500 kesalahan ketika saya mencoba untuk melihat situs, dan di manajer IIS ketika saya mencoba untuk melihat pemetaan pawang, saya mendapatkan kotak sembulan dengan pesan:

Ada kesalahan saat melakukan operasi ini

Detail:

Nama file:

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

Nomor baris: 39

Kesalahan: Kunci pelanggaran

Baris 39 adalah tempat <clear />elemen itu berada.

Beberapa googling membawa saya ke solusi yang melibatkan menjalankan perintah ini:

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

... tapi itu tidak menyelesaikan masalah.

Daniel Schaffer
sumber

Jawaban:

11

Itu dengan desain. Bagian dari system.webServer pada dasarnya mendefinisikan IIS itu sendiri. Jika Anda, Anda tidak akan dibiarkan dengan apa pun. Di applicationHost.config, Anda harus memiliki sesuatu seperti ini:

        <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" />
            ...

Perhatikan properti lockItem. Karena ada 1 atau lebih item kunci, akan menyebabkan pelanggaran kunci.

Jadi, Anda harus menghapus item yang tidak Anda inginkan dari web.config secara khusus, atau jika Anda benar-benar perlu menghapus semuanya dan menambahkan kembali milik Anda, maka di applicationHost.config hapus lockItem = "true" pada masing-masing elemen tersebut, dan pastikan untuk menambahkannya kembali sehingga server web Anda benar-benar berfungsi.

Edit

(Tambahkan informasi lebih lanjut dari Daniel, sesuai permintaannya. (Scott))

Inilah yang saya lakukan berdasarkan apa yang dikatakan Scott:

Membuka applicationHost.config di% windir% \ system32 \ inetsrv \ config. Perhatikan bahwa dalam Windows Server 2008 64 bit, Anda harus mengedit file dengan editor 64 bit (Notepad asli akan berfungsi, tetapi Notepad ++ tidak akan dapat menemukan file). Lihat di sini untuk informasi lebih lanjut tentang ini.

Pada elemen, ubah atribut lockItem pada semua modul menjadi false.

Dalam file web.config aplikasi web saya, kemudian dapat melakukan hal berikut:

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

Tentu saja, seperti yang ditunjukkan Scott, ini berarti tidak ada server web yang tersisa, jadi di sini adalah set minimum modul yang saya perlukan untuk membuat barang-barang saya berjalan kembali (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" />

Juga, bagi siapa pun yang tertarik, inilah latar belakang mengapa saya melakukan ini.

Scott Forsyth - MVP
sumber
2

Scott, dapatkah Anda menambahkan ini ke dalam jawaban Anda?

Inilah yang saya lakukan berdasarkan apa yang dikatakan Scott:

  1. Dibuka applicationHost.configdi %windir%\system32\inetsrv\config. Perhatikan bahwa dalam Windows Server 2008 64 bit, Anda harus mengedit file dengan editor 64 bit (Notepad asli akan berfungsi, tetapi Notepad ++ tidak akan dapat menemukan file). Lihat di sini untuk informasi lebih lanjut tentang ini.

  2. Pada <system.webServer>elemen, ubah lockItematribut pada semua modul menjadi false.

  3. Dalam file web.config aplikasi web saya, kemudian dapat melakukan hal berikut:

    <system.webServer>
       <modules>
          <clear />
       </modules>
    </system.webServer>
    
  4. Tentu saja, seperti yang ditunjukkan Scott, ini berarti tidak ada server web yang tersisa, jadi di sini adalah set minimum modul yang saya perlukan untuk membuat barang-barang saya berjalan kembali (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" />

Juga, bagi siapa pun yang tertarik, inilah latar belakang mengapa saya melakukan ini .

Daniel Schaffer
sumber
Maaf tentang pemformatan pada bit terakhir itu ... karena suatu alasan ia tidak akan menampilkannya dalam format "kode" yang normal.
Daniel Schaffer
Tentu saja. Baru saja menambahkannya.
Scott Forsyth - MVP
2

Saya harap ini belum terlambat untuk membantu.

Saya mendapatkan masalah ini hari ini dan memperbaiki masalah pengeditan dengan mengikuti simpul XML ApplicationHost.Config berikut:

httpErrors lockAttributes = "allowAbsolutePathsWhenDelegated, defaultPath"

Hapus itu ", defaultPath" dan restart IIS Anda (iisreset).

Saya harap ini membantu.

Mercante
sumber