错误 500 Web API

4
我已经尝试了4个小时来解决这个问题。
我有一个新的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中收到的错误是:

enter image description here

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

enter image description here

那么,如果我发送POST请求:

enter image description here

编辑:

这是我的异常处理程序属性:

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

请发布已记录错误的适当异常详细信息(名称、消息、堆栈跟踪)。没有这些信息,您的问题就是含糊不清的。 - Steven
你能否添加一个全局的ExceptionLogger来记录在实际服务器上发生的异常?你可以在这里找到如何操作的信息:http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling - Pedro
@Steven,这是我遇到的问题之一,我无法获得完整的异常信息。 - Dawood Awan
@Pedro 我已经有一个ExceptionHandler属性了 - 我会在问题中发布它。 - Dawood Awan
你可以分享控制器的代码吗? - venerik
显示剩余7条评论
3个回答

1
我认为这是一个路由/命名空间问题。我建议更改您正在使用的控制器和命名空间的名称。更改API命名空间和控制器名称。我的猜测是在某个地方引起了冲突,从而导致500错误。
最近我也遇到了同样的问题。它让我抓狂,造成错误的原因是我有一个名为"Reports"的控制器,它与SSRS发生了路由问题/冲突。就像您的应用程序一样,在开发中它可以工作,因为应用程序资源从未被挂起,而在部署中,根据设置(无论是IIS还是Azure),应用程序资源在一定时间后会被挂起。出现错误的原因是当应用程序尝试在挂起状态下恢复时,在启动时发生的。

但是在我进入主页URL之后它确实可以工作 - 之后一切都正常。 - Dawood Awan

0

要获取异常,您可以使用远程调试器将Visual Studio调试器附加到IIS进程。如果您没有访问远程计算机所需的权限,可以在开发工作站上运行IIS,并尝试在本地部署应用程序,而不是在VS下以开发模式运行。至于<customErrors>,我曾经遇到过更多的情况是更改它没有效果,因此如果可能,请尝试使用部署本地浏览器。

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

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


-1
问 题 出 现 在 Startup.cs 类 上,向 Configuration 方法添加默认的 MapHttpRoute 才使它工作。
[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;
        }

    }
}

你弄清楚问题出在哪里了吗?修复方法是什么?“这就是让它工作的方法”并没有真正帮助任何人。 - Bogdan Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接