Erreur 500 API Web
J'ai essayé de corriger cela pour les 4 dernières heures.
J'ai un nouveau Projet d'API Web qui fonctionne à 100% de l'amende sur le développement,
MAIS sur le serveur live, je reçois un 500 Internal Server Error
.
Quand je le déploiement d'une nouvelle version et d'envoyer une demande directement à http://URL/Action
je reçois le message d'erreur. MAIS
Si je vais à http://URL/
d'abord, puis envoyer la requête POST à http://URL/Action
, il fonctionne.
La même chose est le cas lorsqu'il n'y a pas de requête à l'API pour 12,13 hours
Donc pour qu'il fonctionne, je dois d'abord ouvrir: http://URL/Action
, puis envoyer les POST
demande.
De sorte que le Projet utilise Ninject
et c'est le Startup.cs
using System.Collections.Generic;
using System.Reflection;
using System.Web.Http;
using API.MyApi;
using Business.Bindings;
using Microsoft.Owin;
using Ninject;
using Ninject.Modules;
using Ninject.Web.Common.OwinHost;
using Ninject.Web.WebApi.OwinHost;
using Owin;
[assembly: OwinStartup(typeof(Startup))]
namespace API.MyApi
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
WebApiConfig.Register(config);
app.UseWebApi(config);
app.UseNinjectMiddleware(CreateKernel);
app.UseNinjectWebApi(config);
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
}
private static StandardKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
var modules = new List<INinjectModule>
{
new BusinessBindings(),
new DataBindings()
};
kernel.Load(modules);
return kernel;
}
}
}
Et la WebAPI Config
using System.Web.Http;
namespace API.MyApi
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
//Web API configuration and services
//Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Formatters.XmlFormatter.UseXmlSerializer = true;
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
}
}
}
J'ai essayé d'ajouter cette ligne de code pour obtenir une vue de l'ensemble du message d'erreur:
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
et aussi en ajoutant ceci à la web.config
fichier
<customErrors mode="Off"/>
Mais l'erreur que je reçois dans PostMan est:
Après je navigue à URL.com dans le Navigateur:
Alors Si j'envoie la requête POST:
EDIT:
C'est mon gestionnaire d'exception de l'attribut:
public class ExceptionHandlerAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
var exception = actionExecutedContext.Exception;
using (var exceptionLogger = new CustomLogger("Exceptions"))
{
exceptionLogger.LogExceptionMessage(exception.Message, exception.InnerException, exception.StackTrace);
}
base.OnException(actionExecutedContext);
}
}
et le Contrôleur est décoré avec l'attribut:
[ExceptionHandler]
public class SmartOneCController : BaseApiController
{
public SmartOneCController(CustomLogger logger)
{
}
}
Donc ce que cet Attribut doit faire est de vous Connecter à l'exception d'un fichier journal Qui travaille testé sur le Développement et le déploiement de la version.
Mais n'est pas connecte à l'Exception de la 500 Internal Server Error
Contrôleur de Code, je ne vois pas comment le contrôleur de code de l'aide ici, que tout fonctionne après la visite de l'URL de Base de l'API: URL.com
après ce que je peux appeler cette méthode POST et tout fonctionne.
[ExceptionHandler]
public class SmartOneCController : BaseApiController
{
public SmartOneCController(CustomLogger logger, IAssetsProvider assetsProvider, ISatelliteTrackerProvider satelliteTrackerProvider) : base(logger, assetsProvider, satelliteTrackerProvider)
{
}
public void Post(HttpRequestMessage request)
{
try
{
//Reading data as XML string to log to files - In case message structure is changed
var xmlDoc = new XmlDocument();
xmlDoc.Load(request.Content.ReadAsStreamAsync().Result);
var str = xmlDoc.InnerXml;
_logger.LogMessage(MessageType.Information, string.Format("RAW XML Message: {0}", str));
//Convert to model
var model = XMLHelper.FromXml<trackermessages>(str);
......
- Merci de poster l'exception appropriée des détails (nom, un message, une trace de la pile) de l'erreur enregistré. Sans cette information, votre question est vague.
- pouvez-vous ajouter un mondial ExceptionLogger pour vous connecter à l'exception réelle qui se passe sur le serveur live? Vous pouvez trouver des infos sur comment le faire ici: asp.net/web-api/overview/error-handling/...
- c'est l'un des problème que j'ai je ne peux pas obtenir la complète exception
- J'ai déjà un ExceptionHandler Attribut - je vais le poster dans la question
- Il me semble que quelque chose se passe mal lors de la transformation de la
POST
parce que quelque chose n'a pas été configuré correctement. Apparemment, la mise en place EST en allant vers la droite pendant le traitement, laGET
. Cela pourrait expliquer pourquoi vous devez d'abord faire unGET
et seulement après que lesPOST
réussit. Qui pourrait également expliquer pourquoi lePOST
échoue au bout de 12 à 13 heures (le pool d'applications est arrêté à l'époque). Êtes-vous sûr que vous avez configuré correctement toutes les dépendances? - Pouvez-vous partager le code du contrôleur?
- Er, ceux que vous configurez avec Ninject?
- Oui, vous pouvez voir le code dans le Démarrage.cs
- S'il vous plaît, ajouter le code du contrôleur.
- posté mais je ne vois pas comment cela aidera - comme avant de visiter l'URL de base: url.com - je ne peux même pas appeler la méthode POST - toutes les demandes sont bloquées avant que le contrôleur de l'action est encore frappé
- Laissez-nous continuer cette discussion dans le chat.
- la raison pour laquelle il n'est pas l'enregistrement de l'erreur 500 est parce que vous êtes à l'aide d'un ExceptionFilter qui est connu pour manquer quelques exceptions générées selon l'endroit où dans le pipeline, elle a été lancée. Essayez de mettre en œuvre une IExceptionLogger comme décrit dans asp.net/web-api/overview/error-handling/... et vous devriez commencer à voir l'erreur 500 connecté à votre fichier de log
Vous devez vous connecter pour publier un commentaire.
Pour obtenir de l'exception que vous pouvez attacher le débogueur Visual Studio pour le processus IIS en utilisant le débogueur distant. Si vous n'avez pas l'accès à la machine distante, peut-être exécuter IIS sur votre station de travail de développement et essayez de déploiement de l'application localement, plutôt que de courir dans le développement de mode de VS. Comme pour
<customErrors>
j'ai eu plus d'occasion où les changements n'ont eu aucun effet, donc si vous le pouvez, essayez d'utiliser un navigateur local pour le déploiement.Pour écarter une de routage, de noms ou de problème de contrôleur, vous pouvez aussi essayer d'ajouter un mannequin méthode dans le même contrôleur sans dépendances externes et de voir si l'appel de l'URL se comporte de la même manière.
Que pour la façon dont vous rencontrez le problème; on dirait que l'action du controller vous sont en cours d'exécution via http://URL/Action a peut-être une dépendance qui n'a pas encore initialisés, et en visitant http://URL/ tout d'abord, vous donnant le temps d'application pour initialiser cette dépendance. Le fait que ce qui se passe après une période de temps indiquerait que c'est lié à déterminer si la demande est déjà en cours d'exécution dans IIS, ou l'application de la piscine a l'arrêter et l'application a besoin de faire un plein de commencer quand vous frappez http://URL/
Je dirais que sa routage/espace de noms problème. Je voudrais changer le nom du contrôleur et les espaces de noms que vous utilisez. Changement de l'API de l'espace de noms et le nom du contrôleur. Ma conjecture est que quelque part il est à l'origine d'un conflit qui a conduit à l'erreur 500.
J'ai eu le même problème récemment. Il m'a rendu fou, ce qui a causé l'erreur dans mon cas, c'est que j'avais un contrôleur nommé Rapports à cause d'un problème de routage/conflit avec SSRS. À l'instar de votre application, il travaille dans le développement, car les demandes de ressources sont jamais suspendu où, comme dans le déploiement, selon les paramètres que ce soit IIS ou Azure, les ressources d'application sont suspendus après un certain laps de temps. L'erreur s'est produite lors du démarrage pour une raison quelconque, lorsque la demande de tenter de les récupérer après avoir été dans un état suspendu.
Le Problème était avec le Démarrage.cs de la classe, c'est ce que ai eu de travail