我在过去的4个小时里一直试图解决这个问题。
我有一个新的Web API项目 - 在开发上100%正常工作,
但是在实时服务器上我得到500 Internal Server Error
。
当我部署新版本并直接向http://URL/Action
发送请求时,我收到错误消息。的 BUT
如果我首先转到http://URL/
,然后将POST请求发送到http://URL/Action
,则可以。
对12,13 hours
首先,我必须打开: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 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
文件
<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);
}
}
,Controller使用属性
进行修饰[ExceptionHandler]
public class SmartOneCController : BaseApiController
{
public SmartOneCController(CustomLogger logger)
{
}
}
因此,该属性应该做的是将异常记录到日志文件中 - 该文件正在开发和部署版本上进行测试。
但是没有从500 Internal Server Error
控制器代码,我不知道控制器代码将如何在这里提供帮助,因为在访问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);
......
答案 0 :(得分:1)
要获取异常,可以使用远程调试器将Visual Studio调试器附加到IIS进程。如果您没有对远程计算机的必需访问权限,可以在开发工作站上运行IIS并尝试在本地部署应用程序,而不是在VS下以开发模式运行。至于<customErrors>
我有更多的时间来改变它没有效果,所以如果你能够,请尝试使用部署的本地浏览器。
要排除路由,命名空间或控制器问题,您还可以尝试在同一个控制器中添加一个没有外部依赖关系的虚方法,并查看调用该URL的行为是否相同。
至于你遇到问题的方式;它听起来像您通过http://URL/Action执行的控制器操作可能有一些尚未初始化的依赖项,并且首先访问http://URL/,您将给应用程序时间初始化该依赖项。在一段时间后发生这种情况的事实表明它与应用程序是否已经在IIS中运行有关,或者应用程序池已将其关闭,并且应用程序需要在您点击时完全启动{ {3}}
答案 1 :(得分:0)
我会说它是路由/名称空间问题。我会更改您正在使用的控制器和名称空间的名称。更改API名称空间和控制器名称。我的猜测是它导致冲突导致500错误。
我最近遇到了同样的问题。它让我抓狂,导致我的错误的原因是我有一个名为Reports的控制器导致路由问题/与SSRS发生冲突。就像您的应用程序一样,它在开发中工作,因为应用程序资源永远不会在部署中被挂起,具体取决于设置,无论是IIS还是Azure,应用程序资源在一定时间后暂停。当应用程序在处于挂起状态后尝试恢复时,由于某种原因在启动时发生错误。
答案 2 :(得分:0)
问题在于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<INinjectModule>
{
new BusinessBindings(),
new DataBindings()
};
kernel.Load(modules);
return kernel;
}
}
}