WebApi का {"संदेश": "त्रुटि आई है"} IIS7 पर, IIS एक्सप्रेस में नहीं


171

मैं ASP.NET MVC 4 WebApi के साथ काम कर रहा हूँ और इसे IIS एक्सप्रेस पर अपने स्थानीय कंप्यूटर पर चलाने में बहुत मज़ा आ रहा है। मैंने दूरस्थ मशीनों की भी सेवा करने के लिए IIS एक्सप्रेस को कॉन्फ़िगर किया है, और इसलिए मेरी कंपनी में अन्य लोग मेरे वेबसर्वर के रूप में अपने कंप्यूटर का उपयोग कर रहे हैं।

यह तय करने के बाद एक कम से अधिक इष्टतम समाधान था, हमने .NET 4.5 स्थापित करने के बाद WebApi को एक दूरस्थ सर्वर पर रखने का फैसला किया। जब मैं फ़िडलर का उपयोग करता हूं और अपने स्थानीय मशीन पर एक नियंत्रक को एक POST भेजा जाता है तो वह सही प्रतिक्रिया देता है, फिर भी जब मैं IIS7 को चलाने वाले वेबसर्वर के लिए डोमेन बदलता हूं तो वही POST एक गुप्त रिटर्न देता है

{"संदेश": "एक त्रुटि हुई है"}

संदेश। किसी को भी पता है कि क्या हो सकता है?


2
त्रुटि प्रतिक्रिया पर HTTP स्थिति कोड क्या है? यदि यह 500 है, तो यह बहुत संभावना है कि वेब साइट / एप्लिकेशन कॉन्फिगरेशन दूरस्थ मशीन के लिए IIS 7 के साथ अमान्य है। रिमोट मशीन पर एक साधारण HTML फ़ाइल बनाएं, इसे दूरस्थ मशीन पर ब्राउज़ करें यदि संभव हो तो इसे देखा जा सकता है और फिर कोशिश करें अपनी मशीन से इसे देखने के लिए कि क्या यह सफल है या नहीं।
सिक्स्टो सैज़

यह एक 500 त्रुटि है। सुझाव के लिए धन्यवाद, लेकिन WebApi काम करता है कि डिफ़ॉल्ट index.html पृष्ठ। यह भी जोड़ना चाहिए कि कुछ एपीआई वेबसर्विस काम करते हैं और अन्य नहीं करते हैं, जबकि वे सभी मेरे स्थानीय मशीन पर काम करते हैं।
nsg

2
जब आप 500 त्रुटि देखते हैं तो आपको अधिक विवरण प्राप्त करने के लिए IIS अनुरोध को सक्षम करने की आवश्यकता होगी । 500 एपीआई आमतौर पर वेब एपीआई रूटिंग किक्स से पहले होती है, लेकिन मुझे लगता है कि यह संभव है कि आपका कोड कुछ कर रहा है। IIS ट्रेस लॉगिंग को देखें और देखें कि क्या कोई सुराग प्रदान करता है।
सिक्सटो साज़

1
आप सर्वर मशीन पर ही ब्राउज़र से अनुरोध शुरू करके (जैसे रिमोट डेस्कटॉप सत्र का उपयोग करके) इसकी प्रतिक्रिया में आपको अधिक वर्बोस त्रुटि जानकारी देने के लिए सर्वर प्राप्त करने में सक्षम हो सकते हैं।
जॉन श्नाइडर

जवाबों:


268

समस्या एक लापता निर्भरता थी जो सर्वर पर नहीं थी लेकिन मेरे स्थानीय मशीन पर थी। हमारे मामले में, यह एक Devart.Data.Linq dll था।

उस उत्तर को पाने के लिए, मैंने 500 त्रुटियों के लिए IIS ट्रेसिंग चालू की। इसने थोड़ी सी जानकारी दी, लेकिन वास्तव में सहायक चीज web.config में थी। <system.web><customErrors mode="Off"/></system.web>इसने एक गायब गतिशील रूप से भरी हुई निर्भरता की ओर इशारा किया। इस निर्भरता को जोड़ने और इसे स्थानीय स्तर पर कॉपी करने के लिए कहने के बाद, सर्वर ने काम करना शुरू कर दिया।


33
ऐसा लगता है कि वेबएपीआई जब भी HTTP प्रतिक्रिया कोड 500 और कस्टम त्रुटियां होती हैं, तो वास्तविक प्रतिक्रिया के लिए {"संदेश": "एक त्रुटि आई है"} स्थानापन्न करेगी। सूचक के लिए धन्यवाद।
पॉल सुर्ट

4
CustomErrors मोड सेट करने के बारे में बढ़िया सुझाव। मैं इस तरह की त्रुटियों के उत्पादन पर प्रभाव डालने वाले परिवर्तन से आश्चर्यचकित था।
डेवी रीस

1
आप इसे सेट भी कर सकते हैं mode="RemoteOnly"और यदि आप सर्वर पर एक वेबब्रोसर पर पेज चलाते हैं, तो आपको सुरक्षा से समझौता किए बिना त्रुटियां भी दिखाई देंगी यदि बाकी साइट बाहरी रूप से सुलभ हो
Simon_Weaver

इस तरह की त्रुटि विवरण प्राप्त करने के बारे में कोई सुझाव उस सेटिंग को बदलते समय संभव नहीं है (उदाहरण के लिए मशीन स्तर पर त्रुटियों को अक्षम किया जाता है क्योंकि एपीआई भाग को पीसीआई-संगत सर्वर पर होस्ट किया जाता है)? मैंने एल्म को स्थापित करने की कोशिश की, लेकिन यह दुर्भाग्य से कुछ भी नहीं कर रहा है।
RubyHaus

यह सबसे अच्छा तरीका है, इस तरह के सामान्य तरीके के बारे में पर्याप्त जानकारी देता है।
डैनियल वी।

97

मूल रूप से:

IncludeErrorDetailPolicyइसके बजाय CustomErrorsइसका उपयोग करें यदि यह आपके लिए हल नहीं करता है (उदाहरण के लिए यदि आप ASP.NET स्टैक है> 2012):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

नोट: सावधान रहें विस्तृत त्रुटि जानकारी वापस करने से संवेदनशील जानकारी 'हैकर्स' में आ सकती है। नीचे इस उत्तर पर साइमन की टिप्पणी देखें।

टीएल; डीआर संस्करण

मेरे लिए CustomErrorsवास्तव में मदद नहीं की। यह पहले से ही सेट किया गया था Off, लेकिन मुझे अभी भी केवल एक an error has occurredसंदेश मिला है । मुझे लगता है कि स्वीकृत उत्तर 3 साल पहले से है जो आजकल वेब शब्द में एक लंबा समय है। मैं वेब एपीआई 2 और एएसपी .नेट 5 (एमवीसी 5) का उपयोग कर रहा हूं और माइक्रोसॉफ्ट आईआईएस-ओनली स्ट्रैटेजी से दूर चला गया है, जबकि CustomErrorsआईआईएस स्कूल आईआईएस है;)।

वैसे भी, मेरे पास उत्पादन पर एक मुद्दा था जो मेरे पास स्थानीय स्तर पर नहीं था। और फिर पाया कि मैं क्रोम के नेटवर्क टैब में त्रुटियों को नहीं देख सकता जैसे मैं अपने देव मशीन पर कर सकता हूं। अंत में मैंने इसे अपने प्रोडक्शन सर्वर पर क्रोम इंस्टॉल करके और फिर सर्वर पर ही ऐप को ब्राउज करने में कामयाब रहा (उदाहरण के लिए 'लोकलहोस्ट')। तब स्टैक के निशान और सभी के साथ अधिक विस्तृत त्रुटियां दिखाई दीं।

इसके बाद ही मुझे जिमी बोगार्ड का यह लेख मिला (नोट: जिमी श्री। ऑटमॅपर! ) है। मजेदार बात यह है कि उनका लेख 2012 से भी है, लेकिन इसमें वह पहले से ही बताते हैं कि CustomErrorsइसके लिए कोई मदद नहीं करता है, लेकिन आप IncludeErrorDetailPolicyवैश्विक WebApi कॉन्फ़िगरेशन (जैसे WebApiConfig.cs) में एक अलग सेटिंग करके 'त्रुटि विवरण' को बदल सकते हैं :

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

सौभाग्य से वह यह भी बताता है कि इसे कैसे सेट करना है कि वेबपीआई (2) अपनी CustomErrorsसेटिंग्स को सुनें । यह एक बहुत ही समझदार दृष्टिकोण है, और यह आपको 2012 में वापस जाने की अनुमति देता है: पी।

नोट: डिफ़ॉल्ट मान 'लोकलऑनली' है, जो बताता है कि मैं इस पोस्ट को खोजने से पहले समस्या को हल करने में सक्षम क्यों था। लेकिन मैं समझता हूं कि हर कोई एक ब्राउज़र के उत्पादन और स्टार्टअप के लिए बस रिमोट नहीं कर सकता (मुझे पता है कि मैं ज्यादातर तब तक नहीं कर सकता था जब तक कि मैंने फ्रीलांस और देवओप्स जाने का फैसला नहीं किया)।


2
अब, यह काम करता है। धन्यवाद! मेरे पास कुछ इन-मेमोरी-इंटीग्रेशन-ओविन-तरह के परीक्षण हैं जो बिल्ड सर्वर पर विफल होते हैं, लेकिन स्थानीय रूप से नहीं। अपने स्टार्टअप-क्लास में इस सेटिंग के साथ, मुझे यह पता लगाने का मौका मिल सकता है कि क्यों।
थॉमस आइड

ऐसा प्रतीत होता है कि जब Microsoft के माध्यम से IIS में होस्ट किया जाता है तो CustomError सेटिंग WebApi 2 के साथ काम करती है। Microsoft .NET.ebApi.WebHost। पैकेज संस्करण 5.2.3 हैं, इसलिए ASP.NET स्टैक तरीका पिछले 2012 का है। इसे बंद करने के लिए, वेब एपीआई सामान्य त्रुटियों से अधिक विस्तृत, कॉल स्टैक सहित, आदि पर स्विच करता है ...
टॉम

4
इसे स्थापित करने में सावधानी बरतें क्योंकि यह 'हैकर्स' के प्रति संवेदनशील जानकारी को प्रकट कर सकता है। मैं अक्सर if (DateTime.Now < new DateTime(2017, 6, 22)) { .... }इस तरह का एक विकल्प सेट करने के लिए एक त्वरित हैक कुछ करूँगा । फिर मैं इसे उत्पादन में परीक्षण कर सकता हूं और कल अगर मैं इसे अक्षम करना भूल जाता हूं तो यह सामान्य व्यवहार पर वापस लौट आएगा।
सिमोन_विवर

36

अन्य किसी भी उत्तर ने मेरे लिए काम नहीं किया।

यह किया: (स्टार्टअप में)

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

        WebApiConfig.Register(config);

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

(या आप इसे 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;
    }
}

हाँ!, यह मोनो / लिनक्स पर मेरे लिए एकमात्र कार्यशील समाधान था।
रॉबर्ट II

यह मेरे लिए आईआईएस और विंडोज सर्वर पर आंतरिक रूप से परोसे जाने वाले ऐप के लिए काम करता है।
पॉल कार्लटन

config.IncludeErrorDetailPolicy = शामिल करेंErrorDetailPolicy.Always; मुझे यह पता लगाने में मदद मिली कि मैं एक इकाई का उदाहरण देता हूं जिसे पार्स नहीं किया जा सकता क्योंकि संदर्भ को धन्यवाद
जुड जिंडी

12

मैं हमेशा इस सवाल पर आता हूं जब मैंने परीक्षण के माहौल में त्रुटि की और याद किया, "मैंने पहले भी ऐसा किया है, लेकिन मैं इसे सीधे वेब में कर सकता हूं। कोड को संशोधित किए बिना और परीक्षण के वातावरण में फिर से तैनात किए बिना। , लेकिन यह 2 परिवर्तन लेता है ... यह फिर से क्या था? "

आगामी संदर्भ के लिए

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

तथा

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

11

WebAPI समापन बिंदु पर पोस्ट करते समय मुझे एक समान समस्या थी। CustomErrors = Off को बंद करके, मैं वास्तविक त्रुटि देख पा रहा था जो कि dll में से एक गायब थी।


10

मामले में यह किसी को भी मदद करता है:

मेरे पास एक समान मुद्दा था, और मेरे द्वारा जोड़े गए Nates निर्देशों का पालन कर रहा था:

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

इससे मुझे त्रुटि के बारे में अधिक जानकारी मिली:

"ExceptionMessage": "निर्दिष्ट मेटाडेटा संसाधन को लोड करने में असमर्थ है।", "ExceptionType": "System.Data.Entity.Core.MetadataException", "StackTrace": "System.Data.Entity.Core.Metadata.Edm.MetadataArtifactLoaderोज़ोलोज़र"। .LoadResources (...

यह तब है जब मुझे याद आया कि मैंने edmx फ़ाइल को एक अलग स्थान पर स्थानांतरित कर दिया था और कनेक्शन में कनेक्शन नोड को बदलना भूल गया था (कनेक्शनस्ट्रैप नोड को "configSource" का उपयोग करके एक अलग फ़ाइल में रखा गया था, लेकिन यह एक और कहानी है)।


यह तब हुआ जब asp.net में एक वेब एपीआई में OData और AutoMapper जोड़ते हुए - उम्मीद है कि ये कीवर्ड किसी को इस पोस्ट तक पहुंचने में मदद करते हैं, और कोशिश / पकड़ मेरे मामले में काम नहीं करती थी इसलिए मुझे कच्चा परिणाम देखना पड़ा
Ekus

0

मेरी स्वैगर XML फ़ाइल को \ 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/

यहां छवि विवरण दर्ज करें

इसे रिलीज़ कॉन्फ़िगरेशन के साथ-साथ डीबग कॉन्फ़िगरेशन में सेट किया जाना था।


0

यदि आप <deployment retail="true"/>अपने .NET फ्रेमवर्क के मशीन.कॉन्फिग में हैं, तो आपको विस्तृत त्रुटि संदेश नहीं दिखाई देंगे। सुनिश्चित करें कि सेटिंग झूठी है, या मौजूद नहीं है।


0

इसलिए मैंने बिना किसी लाभ के सभी सुझाए गए समाधानों की कोशिश की। मैंने केवल सर्वर से ऐप चलाने के लिए सेट किया था और यह पूरी तरह से त्रुटि प्रदर्शित करता है, यह तब काम करना चाहिए था जब मैंने कस्टमर मोड को झूठे पर सेट किया था लेकिन यह नहीं हुआ। जिस पल मैंने एपीआई सर्वर को ब्राउज किया, मैं समस्या को देख पा रहा था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.