![](/img/trans.png)
[英]Routing error 404 only when deployed in UAT web server. Works locally. ASP.NET Core
[英]ASP.NET Core (HttpSys) Routing works locally but not when deployed
出于某种原因,当我在Windows服务器上使用HttpSys
运行我的ASP.NET核API(通过服务结构)时,路由不起作用,而本地一切正常。 问题是中间件工作正常,所以我知道请求正在处理但它永远不能打到任何控制器,它只是默认为我的app.run("Some 404 response")
404中间件。 我的一些代码:
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
#region IOC
//ommitted
#endregion
services.AddAutoMapper(typeof(SomeModel));
services.AddCors(c =>
{
c.AddPolicy("AllowOrigin", options => options.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod());
});
services.AddDbContext<SomeContext>(options => options.UseSqlServer(_configuration.GetConnectionString("Dev")));
services.AddMvc().AddFluentValidation();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
IdentityModelEventSource.ShowPII = true;
}
//Eliminating that auth is the problem
//app.UseAuthentication();
if (env.IsProduction())
{
app.UseHsts();
app.UseHttpsRedirection();
}
app.UseCors("AllowOrigin");
app.UseMvcWithDefaultRoute(); //tried this instead of below. No luck
//app.UseMvc();
app.Use((context, next) =>
{
if (context.Request.Path.Value == "" || context.Request.Path.Value == "/")
{
context.Response.ContentType = "text/plain";
return context.Response.WriteAsync("We're running!");
}
return next.Invoke();
});
app.Run(context =>
{
context.Response.StatusCode = 404;
context.Response.ContentType = "application/json";
return context.Response.WriteAsync("{ \"message\": \"Not found\" }");
});
}
}
Program.cs中:
public static void Main(string[] args)
{
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<SomeContext>();
DbInitializer.Initialize(context);
}
catch (Exception ex)
{
logger.Error(ex, "An error occured while seeding the database");
}
}
host.Run();
}
public static IWebHost CreateWebHostBuilder(string[] args)
{
IHostingEnvironment env = null;
var builder =
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureAppConfiguration((hostingContext, config) =>
{
env = hostingContext.HostingEnvironment;
})
.UseHttpSys(options =>
{
if (!env.IsDevelopment())
{
options.UrlPrefixes.Add("https://*:30010/BasePathOfAPI/");
}
else
{
options.UrlPrefixes.Add("http://localhost:5000/BasePathOfAPI/");
}
})
.ConfigureLogging(b =>
{
b.AddApplicationInsights("id here");
})
.UseNLog()
.Build();
return builder;
}
因此除了UrlPrefixes之外,设置几乎相似。 事实上,我可以通过网关和Windows服务器调用https://somehost/BasePathOfAPI/
并获取消息We're running!
显示在浏览器中告诉我API已启动并运行,但如果我尝试,它根本无法点击任何控制器。 控制器的一个例子:
[Route("api/{someNumber:int}/Home")]
[ApiController]
public class HomeController: ControllerBase
{
//ctor and props ommitted
[HttpGet("GetSomeData")
[ProducesResponseType(StatusCodes.200OK)]
public async Task<IActionResult> GetSomeData()
{
//implemenetation
}
}
现在,我用来尝试访问上述控制器的URL是:
https://somehost/BasePathOfAPI/api/1234/Home/GetSomeData
在404消息中返回:未找到,但是如果我在本地运行:
http://localhost:5000/BasePathOfAPI/api/1234/Home/GetSomeData
它工作正常。
不知道我哪里出错了,也许是UrlPrefixes
东西,但如果那不正确,我应该能够找到中间件吗? 也许与路由有关,但为什么它在本地工作?
已解决 - 必须将完整路径库添加到UrlPrefix和urlacl注册中
netsh http add urlacl url=https://*:30010/BasePathOfAPI/ user="NT AUTHORITY\NETWORK SERVICE"
除此之外,控制器在另一个DLL中,必须在ConfigureServices方法中引用该程序集:
services.AddMvc().AddApplicationPart(typeof(SystemController).Assembly)
这两个修复使它工作
这可能是UrlPrefix中弱通配符的问题。
请尝试使用生产绑定: -
options.UrlPrefixes.Add("https://somehost:30010/BasePathOfAPI/");
somehost
是机器的FQDN。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.