2017-07-13 7 views
1

Je tente de configurer des erreurs personnalisées à l'aide d'IIS pour une application de structure .net (créée à l'aide de Visual Studio 2015 si cela est pertinent.) Notre serveur est un serveur Windows 2012 R2 . J'ai vu d'autres solutions de débordement de pile à ce problème mais aucun ne l'a résolu. J'ai des erreurs personnalisées définies sur sur dans ma configuration Web et dans les paramètres de la fonctionnalité des gestionnaires de serveur. Le chemin d'accès à la page d'erreur personnalisée (page HTML statique) est défini dans le gestionnaire de serveur pour tous les codes d'état d'erreur. Certaines piles précédentes suggéraient de désactiver python, donc j'ai essayé, mais ça n'a rien résolu. Ma config web ressemble:Erreur d'exécution: Une erreur s'est produite lors de l'exécution de la page d'erreur personnalisée

<?xml version="1.0"?> 
<!--other web config--> 
<configuration> 
    <configSections> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/> 
    </configSections> 
    <appSettings> 
    <add key="webpages:Version" value="3.0.0.0"/> 
    <add key="webpages:Enabled" value="false"/> 
    <add key="ClientValidationEnabled" value="true"/> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
    </appSettings> 
    <system.web> 
    <httpRuntime targetFramework="4.5"/> 
    <customErrors defaultRedirect="/Views/Home/customError.cshtml" mode="On"/> 
    <compilation debug="true"/> 
    </system.web> 
    <system.webServer> 
    <!--<httpErrors errorMode="Custom" existingResponse="Replace"> 
     <remove statusCode="500" subStatusCode="-1" /> 
     <error statusCode="500" subStatusCode="-1" responseMode="ExecuteURL" path="/Views/Home/customError.cshtml" /> 
    </httpErrors>--> 
    </system.webServer> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed"/> 
     <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35"/> 
     <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35"/> 
     <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/> 
     <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/> 
     <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/> 
     <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0"/> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
    <connectionStrings> 
    <add name="Entities" connectionString="***" providerName="System.Data.EntityClient"/> 
    </connectionStrings> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="v12.0"/> 
     </parameters> 
    </defaultConnectionFactory> 
    </entityFramework> 
</configuration> 

Je ne vois pas de contenu statique double dans la configuration Web. J'ai ajouté toutes les redirections de la page d'erreur iis directement dans le gestionnaire de serveur pour l'application.

Lorsque j'exécute l'application localement et que j'essaie de déclencher une erreur 404, j'obtiens l'erreur d'exécution: Une exception s'est produite lors du traitement de votre demande. En outre, une autre exception s'est produite lors de l'exécution de la page d'erreur personnalisée pour la première exception. La demande a été résiliée. Lorsque je l'exécute via le serveur (en essayant également de déclencher une erreur 404), il charge à la page précédente.

Je ne sais pas comment résoudre ce problème. Toute idée serait géniale! Je vous remercie!

partie pertinente du contrôleur:

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.Entity; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Net; 
using System.Net.Mail; 
using BE.Models; 
using BE.ViewModels; 

namespace BE.Controllers 
{ 

    public class HomeController : Controller 
    { 

     private Entities db = new Entities(); 

     // Uri Route: "~/Home" 
     // View Route: "/Views/Home/Index.cshtml" 
     public ActionResult Index() 
     { 
      return View(); 
     } 


     // Route: "~/Home/customError" 
     // View Route: "/Views/Home/customError.cshtml" 
     public ActionResult customError() 
     { 
      return View(); 
     } 

     public ActionResult About() 
     { 
      return View(); 
     } 


     public ActionResult Contact() 
     { 
      return View(); 
     } 



     public ActionResult Resources() 
     { 
      return View(); 
     } 

    } 
} 

I a également modifié les Global.asax.cs pour ressembler à:

namespace BE 
{ 
    public class MvcApplication : System.Web.HttpApplication 
    { 
     protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
      BundleConfig.RegisterBundles(BundleTable.Bundles); 
     } 
     RouteTable.Routes.MapRoute(
     "Default", 
     "{controller}/{action}/{id}", 
     new { 
      controller = "Home", 
      action = "Index", 
      id = UrlParameter.Optional 
     } 
    ); 
    }; 
}; 

Cependant, cela me donne des erreurs de.

+0

Vous pointez sur un fichier '.cshtml' au lieu d'un fichier HTML approprié. Peut-être que c'est le problème? – DavidG

Répondre

1

Dans MVC, il est possible de rediriger vers l'itinéraire qui desservira la page. Ceci est habituellement indiqué par le contrôleur, pas par la vue. Sauf si la vue est une page html statique. Comme vous utilisez .cshtml je suppose que vous desservez le contenu d'un contrôleur MVC. Votre section devrait ressembler à quelque chose comme ce qui suit:

<system.web> 
    <!-- Default redirect to the ErrorController index --> 
    <customErrors mode="On" defaultRedirect="~/Error"> 
     <!-- Add any custom methods if you want for other error codes --> 
     <error redirect="~/Error/NotFound" statusCode="404" /> 
    </customErrors> 
</system.web> 

Notez également l'utilisation du ~/ pour indiquer que le chemin est relatif à la racine de l'application.

donc assurer dans vos contrôleurs dossier il y a un quelque chose comme classe:

public class ErrorController : Controller { 
    // Uri Route: "~/Error" 
    // View Route: "/Views/Error/Index.cshtml" 
    public ActionResult Index() { 
     return View(); 
    } 

    // Route: "~/Error/NotFound" 
    // View Route: "/Views/Error/NotFound.cshtml" 
    public ActionResult NotFound() { 
     return View(); 
    } 
} 

Dans le Global.asx.cs ou si jamais les routes sont enregistrées dans le dossier App_Start, il devrait y avoir une cartographie de la route comme ceci:

RouteTable.Routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { 
     controller = "Home", 
     action = "Index", 
     id = UrlParameter.Optional 
    } 
); 

Cela doit correspondre à vos itinéraires donnés au bon contrôleur.

+1

Donc, pour clarifier, je dois mettre cela dans mon web.config, et la redirection par défaut devrait conduire au contrôleur, pas à la vue? –

+1

Je viens de modifier le web.config pour ressembler à ceci: C'est ce que vous aviez en tête?En cours d'exécution, j'ai reçu la même erreur que précédemment. –

+1

C'est tout. Vous aurez seulement besoin de la partie 'customErrors' de ma réponse ne supprimez pas les bonnes choses que vous avez déjà dans la section' system.web'. Ensuite, assurez-vous d'avoir un contrôleur pour servir la bonne vue. Assurez-vous également que la configuration des routes de l'application a quelque chose comme '" {controller}/{action}/{id} "' afin que la route soit correctement mappée au contrôleur. – tigerswithguitars