web-dev-qa-db-ja.com

ルーティングは自己ホスト型Web APIでは機能しません

これは基本的に私が持っているもので、新鮮なasp.netコア2.1(実際にはチュートリアルからコピーして貼り付けられたもの)を含む非常に単純な3つのファイルのセットです。

_public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}
_

次に、最も簡単なスタートアップを行います

_class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseMvc();
    }
}
_

そしてデフォルト値コントローラ

_[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] { "value1", "value2" };
    }
}
_

私が何と呼んでも、コンソールに同じ404エラーが表示されます。

_Application started. Press Ctrl+C to shut down.
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://localhost:5000/values
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 105.0181ms 404
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET http://localhost:5000/api/values
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 2.6016ms 404
etc
_

app.UseMvcWithDefaultRoute();を使用してデフォルトルートを追加し、手動で指定してみました。デフォルトルートを使用したときにルート属性を削除してみました。 AddControllersAsServices()も追加してみました。しかし、結果は同じです-404。_app.Run_でカスタムハンドラーをセットアップすると、問題なく動作します。


csproj(デフォルトのMicrosoft.AspNetCore.All依存関係を置き換えましたが、ルーティングはまだ機能しません)

_<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" Version="2.1.0" />
  </ItemGroup>

</Project>
_
11

これを追跡するのはかなり困難でしたが、問題は.csprojでこれに要約されます:

<Project Sdk="Microsoft.NET.Sdk">

Webアプリケーションを構築しているときに、代わりに次のようにWeb SDKを参照する必要があります。

<Project Sdk="Microsoft.NET.Sdk.Web">

この小さな変更により、なんとか問題を再現して修正しました。

18
Kirk Larkin

私にとっては、次のようにAddApplicationPartの後にAddMvcを追加するのに役立ちました:

.AddMvc()
.AddApplicationPart(typeof(Startup).Assembly)
7
user2959372

あなたはこれにコードを変更することができます:

[ApiController]
public class ValuesController : ControllerBase
{
    [HttpGet]
    [Route("api/values")]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] { "value1", "value2" };
    }
}

Route属性は、特定のルートをAPIまたはビューの関数に割り当てるために使用できます。

その後、あなたが呼び出すことができます:

「localhost:5000/api/values」

1
henoc salinas