在IIS上运行ASP.NET 5 Web.API

3

我创建了一个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文档中提供的两个教程这里这里进行操作。我已经将网站发布到机器上的某个位置,并配置了IIS指向该位置。我已启用了IIS日志记录。当我尝试从IIS浏览并访问url http://localhost/TestApi/api/Values/1时,浏览器显示404响应。令我感兴趣的是,在响应头中有一个看起来像是这样的:Server: 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一起工作,但仍然没有找到答案。您有什么想法我做错了什么或如何使其按预期工作吗?我还阅读了这些博客文章,它们似乎是很好的资源,但没有任何关于我遇到的问题的信息:strathwebblogs.msdn 更新:我在Windows 10上尝试过并且遇到了同样的问题,因此我从问题标题中删除了IIS 7.5,因为它似乎不是IIS 7.5特定的问题。

请查看此博客文章:http://www.strathweb.com/2015/12/running-asp-net-5-website-on-iis/ - peco
抱歉,也许不太清楚,但我已经完成了,并在我的帖子底部包含了链接。 - peinearydevelopment
1
你说 http://localhost:20488/api/Values/1 返回了预期的 JSON 值,但你没有说当通过 IIS 访问它时返回了什么?你是否使用了 IIS 虚拟目录?例如:http://localhost/MyApp/api/Values/1。 - Tratcher
抱歉,你是正确的,我以为我之前已经包含了它。我收到了404错误。 - peinearydevelopment
1个回答

4

经过长时间的搜索,我终于找到了如何解决我的问题。之前我没有发布我的Startup.cs文件,因为我认为它与问题无关,因为应用程序在IIS之外似乎正常工作。我仍然相信这是正确的,但是新的ASP.NET 5 应用程序在IIS中工作存在已知问题。(注意:虽然该问题已关闭,但引用了其他未关闭的问题。其中一个链接问题的评论似乎说这将在RC2中修复。) 在我的Startup.cs中,我的Configure方法之前看起来像这样。

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"
      }
    }
  }
}

是的,这确实很烦人。我希望在处理IIS时有一种告知托管URL的方法,以便您可以使用它调用app.Map。对于我的目的,我有一个将部署到多个客户端的应用程序...他们将选择IIS虚拟文件夹...有更好的方法吗? - Arnaud

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