Saya menjalankan mode Terpadu IIS 7 dan saya mendapatkan
Permintaan tidak tersedia dalam konteks ini
ketika saya mencoba mengaksesnya di fungsi terkait Log4Net yang dipanggil dari Application_Start
. Ini adalah baris kode yang saya miliki
if (HttpContext.Current != null && HttpContext.Current.Request != null)
dan pengecualian dilemparkan untuk perbandingan kedua.
Apa lagi yang bisa saya periksa selain memeriksa HttpContext.Current.Request untuk null ??
Pertanyaan serupa diposting @ Permintaan tidak tersedia dalam pengecualian konteks ini ketika runnig mvc di iis7.5
tapi tidak ada jawaban yang relevan di sana.
Jawaban:
Silakan lihat mode Terpadu IIS7: Permintaan tidak tersedia dalam pengecualian konteks ini di Application_Start :
sumber
Ketika Anda memiliki logika logging kustom, agak menjengkelkan untuk dipaksa baik untuk tidak mencatat application_start atau harus membiarkan pengecualian terjadi di logger (bahkan jika ditangani).
Tampaknya daripada menguji
Request
ketersediaan, Anda dapat mengujiHandler
ketersediaan: jika tidak adaRequest
, akan aneh untuk tetap memiliki penangan permintaan. Dan pengujian untukHandler
tidak memunculkanRequest is not available in this context
pengecualian yang ditakuti itu .Jadi, Anda dapat mengubah kode Anda menjadi:
Hati-hati, dalam konteks modul http,
Handler
mungkin tidak didefinisikanRequest
danResponse
didefinisikan (saya telah melihat itu di acara BeginRequest). Jadi jika Anda membutuhkan permintaan / tanggapan logging di modul http kustom, jawaban saya mungkin tidak cocok.sumber
Ini adalah kasus yang sangat klasik: Jika Anda akhirnya harus memeriksa data apa pun yang disediakan oleh contoh http, maka pertimbangkan untuk memindahkan kode itu di bawah
BeginRequest
acara tersebut.Ini adalah tempat yang tepat untuk memeriksa header http, string kueri, dan lain-lain ...
Application_Start
untuk pengaturan yang berlaku untuk aplikasi sepanjang waktu berjalan, seperti perutean, filter, logging, dan sebagainya.Mohon, jangan terapkan solusi apa pun seperti .ctor statis atau beralih ke mode Klasik kecuali tidak ada cara untuk memindahkan kode dari
Start
keBeginRequest
. yang seharusnya bisa dilakukan untuk sebagian besar kasus Anda.sumber
Karena tidak ada lagi konteks Permintaan dalam pipeline selama aplikasi dimulai, saya tidak dapat membayangkan ada cara untuk menebak server / port apa yang mungkin digunakan oleh permintaan aktual berikutnya. Anda harus melakukannya di Begin_Session.
Inilah yang saya gunakan saat tidak dalam Mode Klasik. Overhead dapat diabaikan.
sumber
Berdasarkan kebutuhan rinci OP yang dijelaskan dalam komentar , ada solusi yang lebih tepat. OP menyatakan dia ingin menambahkan data khusus di lognya dengan log4net, data yang terkait dengan permintaan.
Daripada menggabungkan setiap panggilan log4net menjadi panggilan log terpusat kustom yang menangani pengambilan data terkait permintaan (pada setiap panggilan log), log4net menampilkan kamus konteks untuk menyiapkan data tambahan kustom ke log. Menggunakan kamus tersebut memungkinkan untuk memposisikan data log permintaan Anda untuk permintaan saat ini di acara BeginRequest, lalu menutupnya di acara EndRequest. Setiap log in di antaranya akan mendapatkan keuntungan dari data kustom tersebut.
Dan hal-hal yang tidak terjadi dalam konteks permintaan tidak akan mencoba mencatat data terkait permintaan, menghilangkan kebutuhan untuk menguji ketersediaan permintaan. Solusi ini sesuai dengan prinsip yang disarankan Arman McHitaryan dalam jawabannya .
Agar solusi ini berfungsi, Anda juga memerlukan beberapa konfigurasi tambahan pada appenders log4net Anda agar mereka dapat mencatat data khusus Anda.
Solusi ini dapat dengan mudah diimplementasikan sebagai modul peningkatan log kustom. Berikut adalah contoh kode untuk itu:
Tambahkan ke situs Anda, contoh konfigurasi IIS 7+:
Dan siapkan appenders untuk membuat log properti tambahan tersebut, contoh konfigurasi:
sumber
Anda dapat mengatasi masalah ini tanpa beralih ke mode klasik dan tetap menggunakan Application_Start
Untuk beberapa alasan, tipe statis dibuat dengan permintaan dalam HTTPContext-nya, memungkinkan Anda untuk menyimpan dan menggunakannya kembali segera di acara Application_Start
sumber
Saya dapat mengatasi / meretas masalah ini dengan berpindah ke mode "Klasik" dari mode "terintegrasi".
sumber
Ini berhasil untuk saya - jika Anda harus masuk ke Application_Start, lakukan sebelum Anda mengubah konteks. Anda akan mendapatkan entri log, hanya tanpa sumber, seperti:
2019-03-12 09: 35: 43.659 INFO (null) - Aplikasi Dimulai
Saya biasanya mencatat baik Application_Start dan Session_Start, jadi saya melihat lebih detail di pesan berikutnya
2019-03-12 09: 35: 45.064 INFO ~ / Leads / Leads.aspx - Sesi Dimulai (Lokal)
sumber
Di studio visual 2012, Ketika saya menerbitkan solusi secara keliru dengan opsi 'debug', saya mendapat pengecualian ini. Dengan opsi 'rilis' itu tidak pernah terjadi. Semoga membantu.
sumber
Anda dapat menggunakan berikut ini:
sumber
lakukan ini di global.asax.cs:
bekerja seperti pesona. this.Context.Request ada ...
this.Request memunculkan pengecualian secara sengaja berdasarkan sebuah flag
sumber