{"Message" WebApi: "telah terjadi kesalahan"} pada IIS7, bukan di IIS Express

171

Saya bekerja dengan ASP.NET MVC 4 WebApi dan saya bersenang-senang menjalankannya di komputer lokal saya di IIS Express. Saya telah mengkonfigurasi IIS Express untuk melayani mesin jarak jauh juga, dan yang lain di perusahaan saya menggunakan komputer saya sebagai server web kami.

Setelah memutuskan ini adalah solusi yang kurang optimal, kami memutuskan untuk meletakkan WebApi di server jauh setelah menginstal .NET 4.5. Ketika saya menggunakan fiddler dan mengirim POST ke controller di komputer lokal saya, ia mengembalikan respons yang benar, namun ketika saya mengubah domain ke server web yang menjalankan IIS7 POST yang sama mengembalikan cryptic

{"message": "telah terjadi kesalahan"}

pesan. Adakah yang tahu apa yang sedang terjadi?

nsg
sumber
2
Apa kode status HTTP pada respons kesalahan? Jika 500, kemungkinan konfigurasi situs / aplikasi web tidak valid untuk mesin jarak jauh dengan IIS 7. Buat file HTML sederhana pada mesin jarak jauh, jelajahi di mesin jarak jauh jika mungkin untuk memastikannya dapat dilihat dan kemudian coba untuk memukulnya dari mesin Anda untuk melihat apakah itu berhasil atau tidak.
Sixto Saez
Ini adalah 500 kesalahan. Terima kasih atas sarannya, tetapi halaman index.html default yang disediakan WebApi berfungsi. Juga harus menambahkan bahwa beberapa layanan web API berfungsi dan yang lain tidak, sedangkan semuanya bekerja pada mesin lokal saya.
nsg
2
Anda harus mengaktifkan penelusuran permintaan IIS untuk mendapatkan lebih spesifik ketika Anda melihat kesalahan 500. Kesalahan 500 biasanya terjadi sebelum perutean API Web menendang, tetapi saya kira kemungkinan untuk memicunya dengan sesuatu yang dilakukan kode Anda. Lihatlah penelusuran jejak IIS dan lihat apakah itu menawarkan petunjuk.
Sixto Saez
1
Anda mungkin bisa mendapatkan server untuk memberi Anda lebih banyak informasi kesalahan verbose dalam jawabannya dengan memulai permintaan dari browser pada mesin server itu sendiri (misalnya menggunakan sesi Remote Desktop).
Jon Schneider

Jawaban:

268

Masalahnya adalah ketergantungan yang hilang yang tidak ada di server tetapi pada mesin lokal saya. Dalam kasus kami, itu adalah dll Devart.Data.Linq.

Untuk mendapatkan jawaban itu, saya mengaktifkan penelusuran IIS untuk 500 kesalahan. Itu memberi sedikit informasi, tetapi hal yang benar-benar membantu ada di web.config menetapkan <system.web><customErrors mode="Off"/></system.web>Ini menunjuk ke hilangnya ketergantungan yang dimuat secara dinamis. Setelah menambahkan ketergantungan ini dan menyuruhnya untuk disalin secara lokal, server mulai bekerja.

nsg
sumber
33
Sepertinya WebAPI akan menggantikan {"message": "telah terjadi kesalahan"} untuk respons nyata setiap kali kode respons HTTP 500 dan kesalahan khusus aktif. Terima kasih untuk penunjuknya.
Paul Suart
4
Saran bagus tentang pengaturan mode customErrors. Saya terkejut karena perubahan yang berdampak pada output dari kesalahan semacam ini.
Dewi Rees
1
Anda juga dapat mengaturnya mode="RemoteOnly"dan jika Anda menjalankan halaman pada server web pada server Anda juga akan melihat kesalahan tanpa membahayakan keamanan jika sisa situs dapat diakses secara eksternal
Simon_Weaver
Adakah saran tentang cara mendapatkan detail kesalahan seperti ini ketika mengubah pengaturan itu tidak dimungkinkan (mis. Kesalahan dinonaktifkan pada level mesin karena bagian API di-host pada server yang kompatibel dengan PCI)? Saya mencoba mengatur Elmah, tetapi sayangnya itu tidak mencatat apa pun.
RubyHaus
Ini adalah pendekatan terbaik, memberikan info yang cukup tentang metode generik.
DanielV
97

Pada dasarnya:

Gunakan IncludeErrorDetailPolicysebaliknya jika CustomErrorstidak menyelesaikannya untuk Anda (mis. Jika Anda ASP.NET stack> 2012):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

Catatan: Hati-hati mengembalikan info kesalahan terperinci dapat mengungkapkan informasi sensitif ke 'peretas'. Lihat komentar Simon pada jawaban di bawah ini.

TL; versi DR

Bagi saya CustomErrorstidak terlalu membantu. Sudah diatur ke Off, tapi saya masih mendapat an error has occurredpesan sangat sedikit . Saya kira jawaban yang diterima adalah dari 3 tahun yang lalu yang sudah lama ada di web word saat ini. Saya menggunakan Web API 2 dan ASP.NET 5 (MVC 5) dan Microsoft telah beralih dari strategi hanya-IIS, sedangkan CustomErrorsskool IIS lama;).

Lagi pula, saya punya masalah pada produksi yang tidak saya miliki secara lokal. Dan kemudian menemukan saya tidak bisa melihat kesalahan di tab Jaringan Chrome seperti yang saya bisa di mesin dev saya. Pada akhirnya saya berhasil menyelesaikannya dengan memasang Chrome di server produksi saya dan kemudian menjelajah ke aplikasi yang ada di server itu sendiri (misalnya di 'localhost'). Kemudian kesalahan yang lebih rinci muncul dengan tumpukan jejak dan semuanya.

Baru setelah itu saya menemukan artikel ini dari Jimmy Bogard (Catatan: Jimmy is mr. AutoMapper! ). Yang lucu adalah bahwa artikelnya juga berasal dari 2012, tetapi di dalamnya dia sudah menjelaskan bahwa CustomErrorstidak membantu untuk ini lagi, tetapi bahwa Anda BISA mengubah 'Rincian kesalahan' dengan mengatur yang berbeda IncludeErrorDetailPolicydalam konfigurasi WebApi global (misalnya WebApiConfig.cs):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

Untungnya dia juga menjelaskan cara mengaturnya bahwa webapi (2) TIDAK mendengarkan CustomErrorspengaturan Anda . Itu pendekatan yang cukup masuk akal, dan ini memungkinkan Anda untuk kembali ke 2012: P.

Catatan: Nilai default adalah 'LocalOnly', yang menjelaskan mengapa saya bisa menyelesaikan masalah seperti yang saya jelaskan, sebelum menemukan posting ini. Tapi saya mengerti bahwa tidak semua orang bisa hanya jauh untuk produksi dan memulai browser (saya tahu saya kebanyakan tidak bisa sampai saya memutuskan untuk pergi lepas dan DevOps).

Bart
sumber
2
Sekarang, ini berhasil. Terima kasih! Saya memiliki beberapa tes di memori-integrasi-owin-jenis yang gagal pada server build, tetapi tidak secara lokal. Dengan pengaturan ini di kelas startup saya, saya mungkin memiliki kesempatan untuk mencari tahu alasannya.
Thomas Eyde
Tampaknya pengaturan customError berfungsi dengan WebApi 2 saat dihosting di IIS melalui Microsoft.AspNet.WebApi.WebHost. Paket adalah versi 5.2.3, jadi ASP.NET stack melewati 2012. Dengan mengaturnya ke Off, api web beralih dari kesalahan umum menjadi lebih detail, berisi panggilan stack, dll ...
Tom
4
Hati-hati mengatur ini karena dapat mengungkapkan informasi sensitif ke 'peretas'. Saya akan sering melakukan hack cepat sesuatu seperti if (DateTime.Now < new DateTime(2017, 6, 22)) { .... }mengatur opsi seperti ini. Lalu saya bisa mengujinya dalam produksi dan besok itu secara ajaib akan kembali ke perilaku normal jika saya lupa menonaktifkannya.
Simon_Weaver
36

Tidak ada jawaban lain yang bekerja untuk saya.

Ini berhasil: (di Startup.cs)

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();

        WebApiConfig.Register(config);

        // Here: 
        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    }
}

(atau Anda dapat meletakkannya di WebApiConfig.cs):

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        // Here: 
        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    }
}
samneris
sumber
Ya !, Ini adalah satu-satunya solusi yang berfungsi untuk saya di Mono / Linux.
Robert II
Ini bekerja untuk saya di prod untuk aplikasi yang dilayani secara internal di IIS dan Windows Server.
Paul Carlton
config.IncludeErrorDetailPolicy = SertakanErrorDetailPolicy.Always; membantu saya menemukan bahwa saya mengembalikan instance entitas yang tidak dapat diuraikan karena konteksnya telah dibuang terima kasih
Jood jindy
12

Saya selalu datang ke pertanyaan ini ketika saya menemukan kesalahan di lingkungan pengujian dan ingat, "Saya pernah melakukan ini sebelumnya, tapi saya bisa melakukannya langsung di web.config tanpa harus mengubah kode dan menggunakan kembali ke lingkungan pengujian , tapi butuh 2 perubahan ... apa itu lagi? "

Untuk referensi di masa mendatang

<system.web>
   <customErrors mode="Off"></customErrors>
</system.web>

DAN

<system.webServer>
  <httpErrors errorMode="Detailed" existingResponse="PassThrough"></httpErrors>
</system.webServer>
Rick Glos
sumber
11

Saya memiliki masalah yang sama ketika memposting ke titik akhir WebAPI. Dengan memutar CustomErrors = Off, saya dapat melihat kesalahan aktual yang merupakan salah satu dll hilang.

ctong
sumber
10

Dalam hal ini membantu siapa pun:

Saya memiliki masalah yang sama, dan mengikuti instruksi Nates saya menambahkan:

<system.web>
     <customErrors mode="Off"/>
 </system.web>

Ini menunjukkan kepada saya informasi lebih lanjut tentang kesalahan:

"ExceptionMessage": "Tidak dapat memuat sumber daya metadata yang ditentukan.", "ExceptionType": "System.Data.Entity.Core.MetadataException", "StackTrace": "di System.Data.Entity.Core.Metadata.Edm.MetadataArtifactLoaderCount sumber daya .LoadResources (...

Ini adalah ketika saya ingat bahwa saya telah memindahkan file edmx ke lokasi yang berbeda dan lupa untuk mengubah node connectionstrings di konfigurasi (node ​​koneksistrings ditempatkan di file terpisah menggunakan "configSource", tapi itu cerita lain).

hormberg
sumber
Ini terjadi pada saya ketika menambahkan OData dan AutoMapper ke api web di asp.net - semoga kata kunci ini membantu seseorang mencapai posting ini, dan coba / tangkap tidak berfungsi dalam kasus saya jadi saya harus melihat hasil mentah
Ekus
0

File XML angkuh saya tidak digunakan ke \ bin:

GlobalConfiguration.Configuration
  .EnableSwagger(c =>
  {
    c.SingleApiVersion("v1", "SwaggerDemoApi");
    c.IncludeXmlComments(string.Format(@"{0}\bin\SwaggerDemoApi.XML", 
                         System.AppDomain.CurrentDomain.BaseDirectory));
    c.DescribeAllEnumsAsStrings();
  })

http://wmpratt.com/swagger-and-asp-net-web-api-part-1/

masukkan deskripsi gambar di sini

Itu harus diatur dalam Konfigurasi Rilis serta di Konfigurasi Debug.

RaSor
sumber
0

Jika ada <deployment retail="true"/>di machine.config .NET Framework Anda, Anda tidak akan melihat pesan kesalahan terperinci. Pastikan bahwa pengaturan itu salah, atau tidak ada.

Eric H.
sumber
0

Jadi saya mencoba semua solusi yang disarankan tetapi tidak berhasil. Yang saya lakukan adalah mengatur menjalankan aplikasi dari server dan itu menampilkan kesalahan secara penuh, ini seharusnya bekerja ketika saya mengatur mode customErrors ke false tetapi tidak. Saat saya melihat-lihat bentuk API server saya bisa melihat masalah.

Pangeran Tegaton
sumber