在IIS

时间:2015-12-22 18:11:32

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

我在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文档herehere中提供的两个教程进行操作。

我已将我的网站发布到我的计算机上的某个位置,并已设置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一起工作,但仍然没有找到答案。

知道我做错了什么,或者我怎么能按预期工作?

我已经查看了这些博客文章,这些文章似乎是很好的资源,但没有关于我遇到的问题的任何信息:strathwebblogs.msdn

更新 我在使用IIS 10的Windows 10上尝试过此操作并遇到同样的问题,因此我从问题的标题中删除了IIS 7.5,因为它似乎不是IIS 7.5特定的。

1 个答案:

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