【问题标题】:Running ASP.NET 5 Web.API on IIS在 IIS 上运行 ASP.NET 5 Web.API
【发布时间】:2016-03-29 01:57:03
【问题描述】:

我在 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 特定的。

【问题讨论】:

标签: iis asp.net-web-api asp.net-core


【解决方案1】:

经过大量搜索,我终于找到了解决问题的方法。我之前没有发布我的 Startup.cs 文件,因为我认为它与问题无关,因为应用程序似乎在 IIS 之外正常工作。我仍然相信这是真的,但新的ASP.NET 5 apps working in IIS 似乎存在一个已知问题。 (注意:虽然该问题已关闭,但它引用了其他未解决的问题。其中一个链接问题中的 cmets 似乎说这将通过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"
      }
    }
  }
}

【讨论】:

  • 是的,这很烦人。我希望在处理 IIS 时有一种方法可以告诉托管 URL,以便您可以使用它调用 app.Map。出于我的目的,我有一个将部署给多个客户的应用程序......他们会选择 IIS 虚拟文件夹......有没有更好的方法来做到这一点?
猜你喜欢
  • 2018-01-03
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多