我已经尝试了4个小时来解决这个问题。
我有一个新的Web API项目 - 在开发中完全正常运行,
但是在生产服务器上,我得到了500内部服务器错误。
当我部署一个新版本并直接发送请求到http://URL/Action时,我会收到错误。但是如果我先转到http://URL/,然后再发送POST请求到http://URL/Action,它就可以工作。
当API没有请求12,13小时时也是如此。
所以为了让它起作用,我必须首先打开:http://URL/Action,然后发送POST请求。
因此,该项目使用Ninject,这是Startup.cs。
我尝试添加了这行代码以查看完整的错误信息视图:
但是我在PostMan中收到的错误是: 在浏览器中导航到URL.com后:
所以这个属性应该将异常记录到日志文件中-在开发和部署版本上都经过测试。
但是它没有记录来自500内部服务器错误的异常。
控制器代码,我不知道控制器代码如何帮助这里,因为在访问API的基本URL:
我有一个新的Web API项目 - 在开发中完全正常运行,
但是在生产服务器上,我得到了500内部服务器错误。
当我部署一个新版本并直接发送请求到http://URL/Action时,我会收到错误。但是如果我先转到http://URL/,然后再发送POST请求到http://URL/Action,它就可以工作。
当API没有请求12,13小时时也是如此。
所以为了让它起作用,我必须首先打开:http://URL/Action,然后发送POST请求。
因此,该项目使用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<INinjectModule>
{
new BusinessBindings(),
new DataBindings()
};
kernel.Load(modules);
return kernel;
}
}
}
还有WebAPI配置
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
文件中
<customErrors mode="Off"/>
但是我在PostMan中收到的错误是: 在浏览器中导航到URL.com后:
那么,如果我发送POST请求:
编辑:
这是我的异常处理程序属性:
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);
}
}
控制器被装饰了属性:
[ExceptionHandler]
public class SmartOneCController : BaseApiController
{
public SmartOneCController(CustomLogger logger)
{
}
}
所以这个属性应该将异常记录到日志文件中-在开发和部署版本上都经过测试。
但是它没有记录来自500内部服务器错误的异常。
控制器代码,我不知道控制器代码如何帮助这里,因为在访问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<trackermessages>(str);
......