错误500 Web API

过去4个小时我一直试图解决这个问题。

我有一个新的Web API项目 – 在开发上100%正常工作,

但是在实时服务器上我得到500 Internal Server Error

当我部署新版本并直接向http://URL/Action发送请求时,我收到错误。 但是,如果我转到http://URL/ first然后将POST请求发送到http://URL/Action ,它可以工作。

如果没有对API提出12,13 hours请求,情况也是如此

因此,首先我必须打开: http://URL/Action ,然后发送POST请求。

所以Project使用Ninject ,这是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 { new BusinessBindings(), new DataBindings() }; kernel.Load(modules); return kernel; } } } 

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

我已经尝试添加这行代码来获取整个错误消息的视图:

 GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 

并将其添加到web.config文件中

  

但是我在PostMan中得到的错误是:

在此处输入图像描述

在浏览器中导航到URL.com后:

在此处输入图像描述

然后,如果我发送POST请求:

在此处输入图像描述

编辑:

这是我的exception处理程序属性:

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

Controller使用以下属性进行修饰:

 [ExceptionHandler] public class SmartOneCController : BaseApiController { public SmartOneCController(CustomLogger logger) { } } 

那么这个属性应该做的是将exception记录到日志文件中 – 这在开发和部署版本上都经过了测试。

但是不记录500 Internal Server Error的exception

控制器代码,我看不到控制器代码如何在这里提供帮助,因为在访问API的基本URL之后一切正常: URL.com之后我可以调用这个POST方法,一切正常。

 [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(str); ...... 

要获取exception,可以使用远程调试器将Visual Studio调试器附加到IIS进程。 如果您没有远程计算机所需的访问权限,可以在开发工作站上运行IIS并尝试在本地部署应用程序,而不是在VS下以开发模式运行。 对于我有更多的时间来改变它没有任何效果,所以如果你能够,尝试使用部署的本地浏览器。

要排除路由,命名空间或控制器问题,您还可以尝试在同一个控制器中添加一个没有外部依赖关系的虚拟方法,并查看调用该URL的行为是否相同。

至于你遇到问题的方式; 它听起来像你正在执行的控制器操作http:// URL / Action可能有一些尚未初始化的依赖项,并且通过访问http:// URL / first,您正在给应用程序时间初始化该依赖项。 在一段时间后发生这种情况的事实表明它与应用程序是否已经在IIS中运行有关,或者应用程序池已将其关闭,并且当您点击http:// URL时应用程序需要完全启动/

我会说它是路由/命名空间问题。 我会更改您正在使用的控制器和名称空间的名称。 更改API命名空间和控制器名称。 我的猜测是它导致冲突导致500错误。

我最近遇到了同样的问题。 它让我抓狂,导致我的错误的原因是我有一个名为Reports的控制器导致路由问题/与SSRS发生冲突。 就像您的应用程序一样,它在开发中工作,因为应用程序资源永远不会在部署中暂停,具体取决于设置,无论是IIS还是Azure,应用程序资源在一定时间后暂停。 当应用程序在处于挂起状态后尝试恢复时,由于某种原因在启动时发生错误。

问题在于Startup.cs类,这就是它的工作原理

 [assembly: OwinStartup(typeof(Startup))] namespace API.MyApi { public class Startup { public void Configuration(IAppBuilder app) { var webApiConfiguration = new HttpConfiguration(); webApiConfiguration.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); app.UseNinjectMiddleware(CreateKernel); app.UseNinjectWebApi(webApiConfiguration); } private static StandardKernel CreateKernel() { var kernel = new StandardKernel(); kernel.Load(Assembly.GetExecutingAssembly()); var modules = new List { new BusinessBindings(), new DataBindings() }; kernel.Load(modules); return kernel; } } }