我在ASP.NET 5中创建了一个应用程序。目前我只是尝试公开一个非常简单的Web.API方法来尝试使其工作。控制器如下所示:
using System.Threading.Tasks;
using Microsoft.AspNet.Mvc;
namespace Api
{
[Route("api/[controller]")]
public class ValuesController : Controller
{
[HttpGet("{id}")]
public async Task<Value> Get(int id)
{
return await Task.Factory.StartNew(() => new Value { Id = id });
}
}
}
我尝试按照asp.net文档here和here中提供的两个教程进行操作。
我已将我的网站发布到我的计算机上的某个位置,并已设置IIS指向它。我已启用IIS日志记录。当我尝试从IIS浏览并转到URL http://localhost/TestApi/api/Values/1时,我在浏览器中收到404响应。我也很有意思,因为在ResponseHeaders中我有一个看起来像这样的:服务器:Kestrel。 这不应该是IIS吗?
我还在日志目录中获取了一个日志文件,它看起来像这样:
Hosting environment: Production
Now listening on:http://localhost:20488
Application started. Press Ctrl+C to shut down.
但是当我转到http://localhost:20488/api/Values/1时,我会返回我的JSON对象。 {Id:1}
我无法弄清楚我做错了什么。我已经搜索了很多,试图找出适当的配置是什么让它与IIS一起工作,但仍然没有找到答案。
知道我做错了什么,或者我怎么能按预期工作?
我已经查看了这些博客文章,这些文章似乎是很好的资源,但没有关于我遇到的问题的任何信息:strathweb,blogs.msdn
更新 我在使用IIS 10的Windows 10上尝试过此操作并遇到同样的问题,因此我从问题的标题中删除了IIS 7.5,因为它似乎不是IIS 7.5特定的。
答案 0 :(得分:4)
经过多次搜索,我终于找到了解决问题的方法。我以前没有发布我的Startup.cs文件,因为我认为它与问题无关,因为应用程序似乎在IIS之外正常工作。我仍然相信这是真的,但新ASP.NET 5 apps working in IIS似乎存在已知问题。 (注意:当该问题被关闭时,它会引用其他未解决的问题。其中一个链接问题中的一条评论似乎表示这将通过RC2修复。) 在我的Configure方法在Startup.cs中看起来像这样之前
public void Configure(IApplicationBuilder app)
{
app.UseIISPlatformHandler();
app.UseMvc();
}
我需要将此方法更改为:
public void Configure(IApplicationBuilder app)
{
app.UseIISPlatformHandler();
app.Map("/TestApi", builder => builder.UseMvc());
}
显然,IIS只是将它直接传递给应用程序的URL,并且由于URL是http://localhost/TestApi/api/Values/1,因此应用程序不知道如何处理带有“TestApi”的路由。一旦我改变了并再次发布它。当通过IIS转到该URL时,应用程序按预期响应。
为了让我在开发过程中更轻松,以便我可以通过VS和IIS运行应用程序,而无需更改Configure方法的第二行,有两个选项。一种方法是将Map调用包装在if语句中,只在生产中调用Map函数,否则调用app.UseMvc()。我选择做的虽然是我改变了我的launchSettings.json我更新它看起来像这样:
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:49482/TestApi",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"Hosting:Environment": "Development"
}
},
"web": {
"commandName": "web",
"environmentVariables": {
"Hosting:Environment": "Development"
}
}
}
}