ASP.NET Core WebAPI在IIS 7.5中出现500内部错误

8
我很愁如何让WebAPI与IIS协同工作。在IIS Express中一切正常,但发布到服务器后,特别是其中1个API请求无法正常工作。我试图访问 API/[Controller]/{date}/{integer}的URL,但不断收到500服务器错误。而我的另一个路由API/[Controller]/{date}是可以使用的。
这是我的API控制器:
[Route("api/[controller]")]
    public class PostingsController : Controller
    {
        // GET: api/Postings/5
        [HttpGet("{date}")]
        public string Get(string date)
        {
            return date;
        }

        // GET api/Postings/20160407/2
        [HttpGet("{date}/{modeID}")]
        public List<TruckPosting> Get(string date, int modeID)
        {
            TruckPosting tp = new TruckPosting();
            List<TruckPosting> truckPostings = tp.GetTruckPostings(date, modeID);
            return truckPostings;
        }
    }

可能的原因是我正在尝试返回一个List<>?考虑到它在VS的IIS Express中正常工作,我感到困惑。

编辑

这是我的startup.cs页面:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
        }

public void Configure1(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
            {
                app.UseIISPlatformHandler();
                app.UseDefaultFiles();
                app.UseStaticFiles();
                app.UseFileServer(true);
                app.UseMvc();
            }

            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
            {
                app.Map("/appRoot", (app1) => this.Configure1(app1, env, loggerFactory));
            }

你有检查服务器的事件日志吗?通常500错误是由异常引起的,而且你可以在IIS机器的“应用程序日志”中找到这些详细信息。 - CodingGorilla
@Infer-On 你是什么意思? - Brandon
@CodingGorilla 日志没有什么特别的。只是一些时间空闲日志和一些404错误。语法正确吗?例如,我可以传递一个字符串参数,然后是一个整数吗?({date} 是字符串,{modeID} 是整数) - Brandon
@BrandonTerry 是的,你的语法看起来没问题,而且它在 IIS Express 中运行正常(这基本上就是 IIS),这告诉我它是 IIS 服务器上的某些配置问题。你检查了事件日志(例如 eventvwr.msc),而不是 IIS 日志,对吧?另一件事是在你的 web.config 中更改 <customErrors mode="Off"/>,然后使用浏览器访问 API,看看是否会出现带有更多详细信息的黄色屏幕错误。 - CodingGorilla
@CodingGorilla 我在哪里可以找到那些日志文件?不幸的是,自定义错误模式没有起作用。Core和IIS 7.5之间有一些奇怪的问题。我努力让应用程序最终运行。这一切都与映射有关。我必须在我的startup.cs文件中使用app.map,我认为这可能是API的问题所在。由于某种原因,IIS没有使用正确的URL或其他什么东西。 - Brandon
显示剩余7条评论
2个回答

12

这是一个好想法,可能是因为你返回了一个 List。我们有可用的 Core Web API 方法,它们都返回 Task<IEnumerable<Foo>>。尝试将返回类型从 List<TruckPosting> 改为 Task<IEnumerable<TruckPosting>>

编辑:要查看 500(内部服务器)错误的详细信息,您需要在 Configure(或 Configure1)方法的开头加入以下代码行:

app.UseDeveloperExceptionPage();   

显然,这不是您希望在生产环境中出现的情况。

编辑2:在VS中运行时,只要在属性的调试部分设置Hosting:Environment变量为“Development”,就可以使用下面的代码显示异常细节。发布后,您需要创建一个名为ASPNET_ENV的系统环境变量,并将其值设置为“Development” ,否则代码将不会调用UseDeveloperExceptionPage()方法。

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}

这就是为什么你想要使用 if (env.IsDevelopment()),这样你就不必添加和删除 dev exception page - Hypnobrew
是的,但我不知道他是如何发布他的项目的,所以我没有设置环境变量来使其工作。仔细想想,我可能应该这样做。我会更新答案以显示这一点。 - Clint B
好的,我已经缩小了范围。它与我返回的对象列表有关。我发现这一点是因为如果我只返回几个字符串的简单列表,它就可以正常工作。我不知道如何调试它。app.UseDeveloperExceptionPage没有改变任何东西。它需要按什么顺序进行? - Brandon
@ClintB 好的,我成功让错误信息显示出来了。问题不在于我返回的列表,而是我使用的SqlClient获取数据时出现了问题。它显示“无法加载DLL“mycpu path\sni.dll”。有什么想法吗? - Brandon
我遇到了同样的类型错误,也禁用了我的开发环境异常页面。花了我两天时间才解决。谢谢啊。 - Ahmad
显示剩余2条评论

0
今天我在GitHub上发布了一个ASP.NET Core自定义异常处理程序。我认为这可能对你有所帮助,因为你正在构建SPA并且可能会调用很多Web API方法。
它是一个中间件项目,用于返回Web API调用的错误消息,并针对非Web API调用重定向到错误页面。它还可以将异常记录在SQL Server数据库中。这是在单独的线程中完成的,以提高性能。
该解决方案包括一个演示应用程序,展示了如何同时处理Web API异常和非Web API异常的异常处理程序。
这是链接。
https://github.com/ClintBailiff/CustomExceptionHandler 如果你查看了它并有一些建议或评论,我很乐意听取。

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