WebApi'nin {"message": "bir hata oluştu"} IIS7'de, IIS Express'te değil


171

ASP.NET MVC 4 WebApi ile çalışıyorum ve IIS Express üzerinde yerel bilgisayarımda çalışarak çok eğleniyorum. IIS Express'i uzak makinelere de hizmet verecek şekilde yapılandırdım ve böylece şirketimdeki diğerleri bilgisayarımı web sunucumuz olarak kullanıyor.

Bunun optimal olmayan bir çözüm olduğuna karar verdikten sonra, .NET 4.5'i yükledikten sonra WebApi'yi uzak bir sunucuya koymaya karar verdik. Kemancı kullandığımda ve yerel makinemdeki bir denetleyiciye bir POST gönderdiğimde, doğru yanıtı döndürüyor, ancak etki alanını IIS7 çalıştıran web sunucusuna değiştirdiğimde aynı POST bir şifreli döndürüyor

{"message": "bir hata oluştu"}

İleti. Neler olup bittiğine dair bir fikri olan var mı?


2
Hata yanıtındaki HTTP durum kodu nedir? 500 ise, web sitesi / uygulama yapılandırmasının IIS 7 ile uzak makine için geçersiz olması muhtemeldir. Uzak makinede basit bir HTML dosyası oluşturun, görüntülenebildiğinden emin olmak için mümkünse uzak makinede gezinin ve ardından deneyin başarılı olup olmadığını görmek için makinenizden vurmak.
Sixto Saez

500 hatasıdır. Öneri için teşekkürler, ancak WebApi'nin sağladığı varsayılan index.html sayfası çalışıyor. Ayrıca, API web hizmetlerinin bazılarının işe yaradığını ve diğerlerinin çalışmadığını, ancak bunların hepsinin yerel makinemde çalıştığını da eklemelisiniz.
nsg

2
500 hatası gördüğünüzde daha ayrıntılı bilgi almak için IIS istek izlemeyi etkinleştirmeniz gerekir . 500 hatası genellikle Web API yönlendirme başladı önce gerçekleşir, ancak kodunuzun yaptığı bir şey tarafından tetiklemek mümkün sanırım. IIS izleme günlüğüne bakın ve bunun herhangi bir ipucu sunup sunmadığına bakın.
Sixto Saez

1
Sunucu makinesinin kendisindeki bir tarayıcıdan (ör. Uzak Masaüstü oturumu kullanarak) isteği başlatarak sunucunun yanıtında size daha ayrıntılı hata bilgileri vermesini sağlayabilirsiniz.
Jon Schneider

Yanıtlar:


269

Sorun, sunucuda olmayan ama yerel makinemdeki eksik bağımlılıktı. Bizim durumumuzda, bu bir Devart.Data.Linq dll idi.

Bu yanıtı almak için, 500 hata için IIS izlemeyi açtım. Bu biraz bilgi verdi, ancak gerçekten yararlı olan şey web.config ayarındaydı.Bu, <system.web><customErrors mode="Off"/></system.web>dinamik olarak yüklenen bir bağımlılığa işaret etti. Bu bağımlılığı ekledikten ve yerel olarak kopyalanmasını söyledikten sonra sunucu çalışmaya başladı.


34
Görünüşe göre HTTP yanıt kodu 500 olduğunda ve özel hatalar açık olduğunda WebAPI, gerçek yanıt yerine {"message": "bir hata oluştu"}. İşaretçi için teşekkürler.
Paul Suart

5
CustomErrors modunu ayarlama hakkında mükemmel öneri. Bu tür hataların çıktısı üzerinde etkisi olan bir sürprizim var.
Dewi Rees

1
ayrıca olarak ayarlayabilirsiniz mode="RemoteOnly"ve sayfayı sunucudaki bir web tarayıcısında çalıştırırsanız, sitenin geri kalanına harici olarak erişilebiliyorsa güvenlikten ödün vermeden hataları da görürsünüz
Simon_Weaver

Bu ayarı değiştirirken bu tür hata ayrıntılarını nasıl alacağınıza dair herhangi bir öneri (örneğin, API kısmı PCI uyumlu bir sunucuda barındırıldığı için makine düzeyinde hatalar devre dışı bırakılıyor)? Elmah'ı kurmayı denedim ama maalesef hiçbir şey kaydetmiyor.
RubyHaus

Bu en iyi yaklaşımdır, böyle genel bir yöntem hakkında yeterli bilgi verir.
DanielV

97

Temelde:

Kullan IncludeErrorDetailPolicyeğer yerine CustomErrorssizin için çözmez (örn sen ASP.NET yığını ise> 2012):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

Not: Ayrıntılı hata bilgilerinin döndürülmesinde dikkatli olun, hassas bilgileri 'bilgisayar korsanlarına' gösterebilir. Aşağıdaki bu cevapla ilgili Simon'un yorumuna bakın.

TL; DR versiyonu

Benim CustomErrorsiçin gerçekten yardımcı olmadı. Zaten ayarlanmıştı Off, ama yine de sadece kibar bir an error has occurredmesaj aldım . Sanırım kabul edilen cevap 3 yıl önceydi, bugünlerde web kelimesinde uzun zaman oldu. Web API 2 ve ASP.NET 5'i (MVC 5) kullanıyorum ve Microsoft CustomErrorseski skool IIS;) ise yalnızca IIS stratejisinden uzaklaştı .

Her neyse, üretim konusunda yerel olarak sahip olmadığım bir sorun vardı. Ardından, geliştirici makinemdeki gibi Chrome'un Ağ sekmesindeki hataları göremediğimi öğrendim. Sonunda Chrome'u üretim sunucuma yükleyip ardından sunucunun kendisinde bulunan uygulamaya (örneğin 'localhost') göz atarak çözmeyi başardım. Sonra yığın izleri ve tüm daha ayrıntılı hatalar ortaya çıktı.

Ancak daha sonra bu makaleyi Jimmy Bogard'dan buldum (Not: Jimmy, Bay AutoMapper! ). Komik olan şey, makalesinin de 2012'den geldiği CustomErrors, ancak bunun artık buna yardımcı olmadığını zaten açıklıyor , ancak IncludeErrorDetailPolicyküresel WebApi yapılandırmasında farklı bir ayar yaparak 'Hata ayrıntısını' değiştirebildiğinizi açıklıyor (örn. WebApiConfig.cs):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

Neyse ki aynı zamanda bu webapi (2) CustomErrors ayarlarınızı . Bu oldukça mantıklı bir yaklaşım ve bu da 2012'ye geri dönmenizi sağlıyor: P.

Not: Varsayılan değer 'LocalOnly' olup, bu yazıyı bulmadan önce sorunu neden tanımladığım şekilde çözebildiğimi açıklar. Ama herkesin sadece bir tarayıcıyı üretip uzaktan başlatamayacağını anlıyorum (serbest ve DevOps'a karar verene kadar çoğunlukla yapamadığımı biliyorum).


2
Şimdi, bu işe yarıyor. Teşekkür ederim! Yapı sunucusunda başarısız olan, ancak yerel olarak olmayan bazı bellek içi entegrasyon-owin-tür testlerim var. Başlangıç ​​sınıfımdaki bu ayar ile nedenini bulma şansım olabilir.
Thomas Eyde

CustomError ayarının Microsoft.AspNet.WebApi.WebHost aracılığıyla IIS'de barındırıldığında WebApi 2 ile çalıştığı görülmektedir. Kapalı olarak ayarlayarak 2012 geçmiş ASP.NET yığını yolu, web api vs ..., çağrı yığınını içeren, daha ayrıntılı için genel hatalardan anahtarın paketleri, sürüm 5.2.3 vardır
Tom

4
Bunu ayarlamaya dikkat edin çünkü hassas bilgileri 'bilgisayar korsanlarına' açığa çıkarabilir. Genellikle böyle if (DateTime.Now < new DateTime(2017, 6, 22)) { .... }bir seçenek belirlemek için hızlı bir saldırı yapacağım . Daha sonra üretimde test edebilirim ve yarın, devre dışı bırakmayı unutursam sihirli bir şekilde normal davranışa geri döner.
Simon_Weaver

36

Diğer cevapların hiçbiri benim için işe yaramadı.

Bunu yaptı: (Startup.cs dosyasında)

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

        WebApiConfig.Register(config);

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

(veya WebApiConfig.cs dosyasına koyabilirsiniz):

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;
    }
}

Evet !, Mono / Linux'ta benim için tek çalışan çözüm buydu.
Robert II

Bu, IIS ve Windows Server'da dahili olarak sunulan bir uygulama için benim için çalıştı.
Paul Carlton

config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; bağlam atıldı çünkü ayrıştırılamayan bir varlığın bir örneğini döndürmek bana yardımcı oldu teşekkür ederim
Jood jindy

12

Test ortamında bir hataya çarptığımda ve "Bunu daha önce yaptım, ancak kodu değiştirmek ve test ortamına yeniden dağıtmak zorunda kalmadan doğrudan web.config içinde yapabilirim. , ama 2 değişiklik gerekiyor ... yine neydi? "

Gelecekte referans olması için

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

VE

<system.webServer>
  <httpErrors errorMode="Detailed" existingResponse="PassThrough"></httpErrors>
</system.webServer>

11

WebAPI uç noktasına gönderim yaparken benzer bir sorun yaşadım. CustomErrors = Kapalı çevirerek, dlls biri olan gerçek hatayı görebiliyordu.


10

Bunun herkese yardımcı olması durumunda:

Benzer bir sorunum vardı ve Nates talimatlarını izleyerek ekledim:

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

Bu bana hata hakkında daha fazla bilgi gösterdi:

"ExceptionMessage": "Belirtilen meta veri kaynağı yüklenemedi.", "ExceptionType": "System.Data.Entity.Core.MetadataException", "StackTrace": "System.Data.Entity.Core.Metadata.Edm.MetadataArtifactLoaderCompositeResource'ta .LoadResources (...

Bu, edmx dosyasını farklı bir konuma taşıdığımı ve config içindeki linkstrings düğümünü değiştirmeyi unuttuğumu hatırlıyorum (connectionsstrings düğümü "configSource" kullanarak ayrı bir dosyaya yerleştirildi, ancak bu başka bir hikaye).


Bu asp.net bir web api OData ve AutoMapper eklerken bana oldu - umarım bu anahtar kelimeler biri bu yazı ulaşmak yardımcı olur ve denemek / catch benim durumumda işe yaramadı bu yüzden ham sonucu görmek zorunda
Ekus

0

Yağma XML dosyam \ bin içine konuşlandırılmadı:

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/

resim açıklamasını buraya girin

Sürüm Yapılandırmasında ve Hata Ayıklama Yapılandırmasında ayarlanması gerekiyordu.


0

Eğer varsa <deployment retail="true"/>sizin NET Framework'ün machine.config, ayrıntılı hata mesajları görmezsiniz. Ayarın yanlış olduğundan veya mevcut olmadığından emin olun.


0

Bu yüzden boşuna tüm önerilen çözümleri denedim. Tüm yaptığım uygulamayı sunucudan çalıştırmak ayarlamak ve hatayı tam olarak görüntülemek için, customErrors modunu false olarak ayarladığımda bu işe yaramış olmalı ama olmadı. Ben sunucu API formu göz an an sorunu görmek mümkün.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.