Asp.net core 在asp.net核心F中找不到控制器#

Asp.net core 在asp.net核心F中找不到控制器#,asp.net-core,f#,Asp.net Core,F#,我正在尝试用asp.net内核在F#中设置一个单元测试。使用下面的代码。但是服务器的代码失败,找不到404。 框架发现控制器的原因是什么 module Tests open System open Xunit open Microsoft.AspNetCore.Builder open Microsoft.AspNetCore.Hosting open Microsoft.AspNetCore.Mvc open Microsoft.Extensions.DependencyInjection

我正在尝试用asp.net内核在F#中设置一个单元测试。使用下面的代码。但是服务器的代码失败,找不到404。 框架发现控制器的原因是什么

module Tests

open System
open Xunit
open Microsoft.AspNetCore.Builder
open Microsoft.AspNetCore.Hosting
open Microsoft.AspNetCore.Mvc
open Microsoft.Extensions.DependencyInjection

type Startup ()  = 
    member  __.ConfigureServices(services: IServiceCollection) =
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2) |> ignore

    member __.Configure(app: IApplicationBuilder, env: IHostingEnvironment) = 
        app.UseMvc() |> ignore

[<Route("api")>]
[<ApiController>]
type TestController() =
    inherit ControllerBase()

    [<HttpGet("testGet")>]
    member __.TestGet() =
        121221

    [<HttpPost("testPost")>]
    member __.TestPost() =
        String.Empty

let buildHost(baseAdress:string) =
    Microsoft.AspNetCore.WebHost
                .CreateDefaultBuilder()
                .UseStartup<Startup>()
                .UseUrls(baseAdress)
                .Build()

[<Fact>]
let ``My test`` () =
    let baseAdress = "https://localhost:9000"
    use host = buildHost(baseAdress)
    host.RunAsync() |> ignore
    let client = new System.Net.Http.HttpClient(BaseAddress = new System.Uri(baseAdress))
    let result = client.GetAsync("api/testGet").Result
    Assert.Equal(System.Net.HttpStatusCode.OK, result.StatusCode)
    Assert.True(result.IsSuccessStatusCode, result.Content.ReadAsStringAsync().Result )

模块测试
开放系统
开放式Xunit
打开Microsoft.AspNetCore.Builder
打开Microsoft.AspNetCore.Hosting
打开Microsoft.AspNetCore.Mvc
打开Microsoft.Extensions.DependencyInjection
类型Startup()=
成员配置服务(服务:IServiceCollection)=
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)|>忽略
成员配置(应用程序:IApplicationBuilder,环境:IHostingEnvironment)=
app.UseMvc()|>忽略
[]
[]
类型TestController()=
继承ControllerBase()
[]
成员_u.TestGet()=
121221
[]
成员_u.TestPost()=
字符串。空
let buildHost(baseAddress:string)=
Microsoft.AspNetCore.WebHost
.CreateDefaultBuilder()
.UseStartup()
.useURL(基本地址)
.Build()
[]
让“我的测试”()=
让BaseAddress=”https://localhost:9000"
使用主机=构建主机(基本地址)
host.RunAsync()|>忽略
让client=new System.Net.Http.HttpClient(BaseAddress=new System.Uri(BaseAddress))
让result=client.GetAsync(“api/testGet”).result
Assert.Equal(System.Net.HttpStatusCode.OK,result.StatusCode)
Assert.True(result.issusccessstatuscode、result.Content.ReadAsStringAsync().result)
以下是fsproj文件的内容


netcoreapp2.2
错误的
错误的
  • 除了上面注释的原因外,您需要将控制器直接放入
    名称空间
    ,而不是
    模块

    命名空间应用程序//
    
  • 除了上面注释的原因外,您需要将控制器直接放入
    名称空间
    ,而不是
    模块

    namespace App//位于提供的答案之上。可以通过在configureServices中配置应用程序管理器来解决此问题,如

        member  this.ConfigureServices(services: IServiceCollection) =
            services
                .AddMvc()
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
                .ConfigureApplicationPartManager(fun m -> 
                    m.FeatureProviders.Add
                         {
                            new Microsoft.AspNetCore.Mvc.Controllers.ControllerFeatureProvider() with 
                                member __.IsController (typeInfo:System.Reflection.TypeInfo) = 
                                            (typeof<ControllerBase>.IsAssignableFrom(typeInfo)) || base. IsController(typeInfo) 
                         }
                ) |> ignore
            services.AddRouteAnalyzer() |> ignore
    
    成员this.ConfigureServices(服务:IServiceCollection)=
    服务
    .AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
    .ConfigureApplicationPartManager(乐趣m->
    m、 功能提供者。添加
    {
    新的Microsoft.AspNetCore.Mvc.Controllers.ControllerFeatureProvider()和
    成员\uuuu.IsController(typeInfo:System.Reflection.typeInfo)=
    (typeof.IsAssignableFrom(typeInfo))| | base.IsController(typeInfo)
    }
    )|>忽略
    services.AddRouteAnalyzer()|>忽略
    
    在提供的答案之上。可以通过在configureServices中配置应用程序管理器来解决此问题,如

        member  this.ConfigureServices(services: IServiceCollection) =
            services
                .AddMvc()
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
                .ConfigureApplicationPartManager(fun m -> 
                    m.FeatureProviders.Add
                         {
                            new Microsoft.AspNetCore.Mvc.Controllers.ControllerFeatureProvider() with 
                                member __.IsController (typeInfo:System.Reflection.TypeInfo) = 
                                            (typeof<ControllerBase>.IsAssignableFrom(typeInfo)) || base. IsController(typeInfo) 
                         }
                ) |> ignore
            services.AddRouteAnalyzer() |> ignore
    
    成员this.ConfigureServices(服务:IServiceCollection)=
    服务
    .AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
    .ConfigureApplicationPartManager(乐趣m->
    m、 功能提供者。添加
    {
    新的Microsoft.AspNetCore.Mvc.Controllers.ControllerFeatureProvider()和
    成员\uuuu.IsController(typeInfo:System.Reflection.typeInfo)=
    (typeof.IsAssignableFrom(typeInfo))| | base.IsController(typeInfo)
    }
    )|>忽略
    services.AddRouteAnalyzer()|>忽略
    
    将project SDK元素更改为使用
    Microsoft.NET.SDK.Web
    。将project SDK更改为Microsoft.NET.SDK.Web无济于事主机是否也可能没有及时启动以处理您向其发出的请求?将project SDK元素更改为使用
    Microsoft.NET.SDK.Web
    。将project SDK更改为Microsoft.NET.Sdk.Web没有帮助也可能是主机没有及时启动来处理您向其发出的请求吗?卓越的方法卓越的方法
        member  this.ConfigureServices(services: IServiceCollection) =
            services
                .AddMvc()
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
                .ConfigureApplicationPartManager(fun m -> 
                    m.FeatureProviders.Add
                         {
                            new Microsoft.AspNetCore.Mvc.Controllers.ControllerFeatureProvider() with 
                                member __.IsController (typeInfo:System.Reflection.TypeInfo) = 
                                            (typeof<ControllerBase>.IsAssignableFrom(typeInfo)) || base. IsController(typeInfo) 
                         }
                ) |> ignore
            services.AddRouteAnalyzer() |> ignore