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

在IIS上运行ASP.NET 5 Web.API,iis,asp.net-web-api,asp.net-core,Iis,Asp.net Web Api,Asp.net Core,我在ASP.NET5中创建了一个应用程序。目前,我正试图公开一个非常简单的Web.API方法,以使其正常工作。控制器如下所示: using System.Threading.Tasks; using Microsoft.AspNet.Mvc; namespace Api { [Route("api/[controller]")] public class ValuesController : Controller { [HttpGet("{id}")]

我在ASP.NET5中创建了一个应用程序。目前,我正试图公开一个非常简单的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 });
        }
    }
}
Hosting environment: Production
Now listening on:http://localhost:20488
Application started. Press Ctrl+C to shut down.
public void Configure(IApplicationBuilder app)
{
    app.UseIISPlatformHandler();
    app.Map("/TestApi", builder => builder.UseMvc());
}
{
  "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"
      }
    }
  }
}
但当我转到时,我会返回JSON对象。{Id:1}

我不知道我做错了什么。我已经搜索了很多,试图找出正确的配置是什么,让它与IIS一起工作,但仍然没有找到答案

知道我做错了什么,或者我如何才能让它按预期工作吗?

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

更新:
我用IIS 10在Windows 10上尝试了此操作,但遇到了相同的问题,因此我从问题标题中删除了IIS 7.5,因为它似乎不是针对IIS 7.5的。

经过多次搜索,我终于找到了解决问题的方法。我之前没有发布Startup.cs文件,因为我认为它与这个问题无关,因为应用程序似乎在IIS之外正常工作。我仍然相信这是真的,但似乎有一个新的已知问题。(注意:虽然该问题已解决,但它引用了其他未解决的问题。其中一个相关问题中的一条评论似乎表示,这将与解决方案一起解决。) 在此之前,我的配置方法在Startup.cs中是这样的

public void Configure(IApplicationBuilder app)
{
    app.UseIISPlatformHandler();
    app.UseMvc();
}
我需要将该方法更改为如下所示:

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 });
        }
    }
}
Hosting environment: Production
Now listening on:http://localhost:20488
Application started. Press Ctrl+C to shut down.
public void Configure(IApplicationBuilder app)
{
    app.UseIISPlatformHandler();
    app.Map("/TestApi", builder => builder.UseMvc());
}
{
  "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直接传递给应用程序,因为URL是以“TestApi”的形式传入的,所以应用程序不知道如何处理其中包含“TestApi”的路由。有一次我改变了这一点,并再次发表了它。当通过IIS转到该URL时,应用程序按预期响应

为了在开发过程中使我的生活更轻松,以便我可以通过VS和IIS运行应用程序,而无需更改Configure方法的第二行,有两个选项。一种方法是将Map调用封装在if语句中,并且仅在生产中调用Map函数,否则调用app.UseMvc()。但我选择做的是更改我的launchSettings.json。我将其更新为如下所示:

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 });
        }
    }
}
Hosting environment: Production
Now listening on:http://localhost:20488
Application started. Press Ctrl+C to shut down.
public void Configure(IApplicationBuilder app)
{
    app.UseIISPlatformHandler();
    app.Map("/TestApi", builder => builder.UseMvc());
}
{
  "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"
      }
    }
  }
}

查看这篇博文:对不起,可能不清楚,但我已经知道了,并且在我的博文底部包含了一个指向它的链接。你说的是返回预期的json值,但你从来没有说过当你通过IIS访问它时会返回什么?您正在使用IIS虚拟目录吗?对不起,你是对的,我以为我以前已经包括了。我收到一个404错误。是的,这很烦人。我希望在处理IIS时有一种方法告诉宿主Url,这样你就可以用它调用app.Map。出于我的目的,我有一个应用程序将部署到多个客户。。。他们将选择IIS虚拟文件夹。。。有更好的方法吗?