it-swarm.com.de

WebApi's {"message": "ein Fehler ist aufgetreten"} auf IIS7, nicht in IIS Express

Ich arbeite mit ASP.NET MVC 4 WebApi und habe viel Spaß damit, es auf meinem lokalen Computer auf IIS Express auszuführen. Ich habe IIS Express so konfiguriert, dass auch Remotecomputer bedient werden. Daher verwenden andere in meinem Unternehmen meinen Computer als Webserver.

Nachdem wir uns für eine weniger als optimale Lösung entschieden hatten, entschieden wir uns, das WebApi nach der Installation von .NET 4.5 auf einem Remote-Server zu installieren. Wenn ich Fiddler verwende und ein POST an einen Controller auf meinem lokalen Computer sende, wird die richtige Antwort zurückgegeben. Wenn ich jedoch die Domäne auf den Webserver ändere, auf dem IIS7 ausgeführt wird, wird das gleiche POST als kryptisch zurückgegeben

{"message": "ein Fehler ist aufgetreten"}

botschaft. Hat jemand eine Idee, was los sein könnte?

164
Nate

Das Problem war eine fehlende Abhängigkeit, die nicht auf dem Server, sondern auf meinem lokalen Computer vorhanden war. In unserem Fall war es eine Devart.Data.Linq-DLL.

Um zu dieser Antwort zu gelangen, habe ich IIS Tracing für 500 Fehler aktiviert. Das gab ein bisschen Information, aber das wirklich Hilfreiche war in der web.config die Einstellung <system.web><customErrors mode="Off"/></system.web> Dies deutete auf eine fehlende dynamisch geladene Abhängigkeit hin. Nachdem Sie diese Abhängigkeit hinzugefügt und mitgeteilt haben, dass sie lokal kopiert werden soll, hat der Server die Arbeit aufgenommen.

250
Nate

Grundsätzlich gilt:

Verwenden Sie stattdessen IncludeErrorDetailPolicy, wenn CustomErrors es für Sie nicht löst (z. B. wenn Ihr ASP.NET-Stack> 2012 ist):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

Hinweis: Seien Sie vorsichtig, wenn Sie detaillierte Fehlerinformationen zurückgeben, da diese sensible Informationen für "Hacker" darstellen können. Siehe Simons Kommentar zu dieser Antwort weiter unten.

TL; DR-Version

Für mich hat CustomErrors nicht wirklich geholfen. Es war bereits auf Off gesetzt, aber ich habe immer noch nur eine dürftige an error has occurred Botschaft. Ich denke, die akzeptierte Antwort stammt von vor 3 Jahren, was heutzutage eine lange Zeit in Word ist. Ich verwende die Web-API 2 und ASP.NET 5 (MVC 5) und Microsoft hat sich von einer IIS-Strategie verabschiedet, während CustomErrors alt ist. Skool IIS;) .

Wie auch immer, ich hatte ein Problem mit der Produktion, das ich vor Ort nicht hatte. Und dann stellte ich fest, dass ich die Fehler auf der Registerkarte "Netzwerk" von Chrome nicht so sehen konnte wie auf meinem Entwicklercomputer. Am Ende habe ich es geschafft, Chrome auf meinem Produktionsserver zu installieren und dann auf dem Server selbst zur App zu navigieren (z. B. auf 'localhost'). Dann sind mit stack detailliertere Fehler aufgetreten Spuren und alles.

Erst danach fand ich dieser Artikel von Jimmy Bogard (Hinweis: Jimmy ist mr. AutoMapper! ). Das Lustige ist, dass sein Artikel ebenfalls aus dem Jahr 2012 stammt, aber darin erklärt er bereits, dass CustomErrors nicht mehr hilft, sondern dass Sie das 'Fehlerdetail' ändern KÖNNEN, indem Sie ein anderes IncludeErrorDetailPolicy in der globalen WebApi-Konfiguration (zB WebApiConfig.cs):

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy 
= IncludeErrorDetailPolicy.Always;

Zum Glück erklärt er auch, wie man es einrichtet, dass webapi (2) Ihre CustomErrors -Einstellungen abhört. Das ist ein ziemlich vernünftiger Ansatz und ermöglicht es Ihnen, auf 2012 zurückzukommen: P.

Hinweis: Der Standardwert ist 'LocalOnly'. Dies erklärt, warum ich das Problem so lösen konnte, wie ich es beschrieben habe, bevor ich diesen Beitrag gefunden habe. Aber ich verstehe, dass nicht jeder einen Browser starten kann (ich weiß, dass ich es meistens nicht konnte, bis ich mich entschlossen habe, freiberuflich AND DevOps zu arbeiten).

90
Bart

Keine der anderen Antworten hat für mich funktioniert.

Das hat geklappt: (in Startup.cs)

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

        WebApiConfig.Register(config);

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

(oder Sie können es in WebApiConfig.cs einfügen):

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

Ich hatte ein ähnliches Problem beim Posten auf dem Web-API-Endpunkt. Durch das Ausschalten der CustomErrors = Off konnte ich den tatsächlichen Fehler sehen, der eine der DLLs fehlte.

11
ctong

Falls dies jemandem hilft:

Ich hatte ein ähnliches Problem und befolgte die Anweisungen von Nates:

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

Dies zeigte mir mehr Informationen über den Fehler:

"ExceptionMessage": "Die angegebene Metadatenressource kann nicht geladen werden.", "ExceptionType": "System.Data.Entity.Core.MetadataException", "StackTrace": "bei System.Data.Entity.Core.Metadata.Edm.MetadataArtifactLoaderCompositeResource .LoadResources (...

Dies war, als ich mich daran erinnerte, dass ich die edmx-Datei an einen anderen Ort verschoben und vergessen hatte, den Verbindungszeichenfolgenknoten in der Konfiguration zu ändern (der Verbindungszeichenfolgenknoten wurde mit "configSource" in eine separate Datei eingefügt, aber das ist eine andere Geschichte).

9
hormberg

Ich komme immer auf diese Frage, wenn ich in der Testumgebung auf einen Fehler stoße und erinnere mich: "Das habe ich schon einmal gemacht, aber ich kann es direkt in der web.config tun, ohne den Code ändern und erneut in der Testumgebung bereitstellen zu müssen , aber es dauert 2 Änderungen ... was war es nochmal? "

Zum späteren Nachschlagen

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

UND

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

Meine Swagger-XML-Datei wurde nicht in\bin bereitgestellt:

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/

enter image description here

Es musste sowohl in der Release-Konfiguration als auch in der Debug-Konfiguration eingestellt werden.

0
RaSor