gpt4 book ai didi

ubuntu - 在 ServiceStack.Core 中,HttpContextAccessor.HttpContext 在 Linux 上为空,而在 Windows 上为非空

转载 作者:太空宇宙 更新时间:2023-11-03 16:52:02 24 4
gpt4 key购买 nike

我有一个在 .NET Core 2.0 上运行的简单 ServiceStack 项目。这在 Windows 上工作正常,但在 Linux 上失败。使用完全相同的代码(见下文)。

服务被注入(inject)一个IHttpContextAccessor,它总是非空的(Win & Linux),但是它的属性HttpContext 在 Linux 上总是空的,在 Linux 上总是非空的 window 。

重现问题的最小项目:

using Funq;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using ServiceStack;

namespace TestSS
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}

public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}

public class Startup
{
public void ConfigureServices(IServiceCollection services) { }

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseDeveloperExceptionPage();
app.UseServiceStack(new AppHost());
}
}

public class AppHost : AppHostBase
{
public AppHost() : base("AO", typeof(InfoService).Assembly) { }

public override void Configure(Container container)
{
var httpContextAccessor = new HttpContextAccessor();
container.Register<IHttpContextAccessor>(httpContextAccessor);
}
}

public class InfoService : Service
{
[Route("/info")] public class InfoRequest { }

private readonly IHttpContextAccessor _accessor;

public InfoService(IHttpContextAccessor accessor)
{
_accessor = accessor;
}

public object Any(InfoRequest request)
{
return $"Accessor: {_accessor};\nContext: {_accessor.HttpContext};";
}
}
}

关于该项目如何在 Linux 上运行:没有反向代理(nginx 等),只是 dotnet build 后跟 dotnet run,在本地访问。恕我直言,没什么特别的,也没什么令人费解的。


赢:Windows 10 企业版

Linux:Ubuntu 16.04 LTS

dotnet --version: 2.0.2(两个平台)


进一步调查:

在 AppHost.Configure 方法中注释 IHttpContextAccessor 注册有一个奇怪的效果:在 Windows 上没有任何变化,一切都按预期工作,在 Linux 上抛出异常,因为依赖关系无法实现。


有没有人有解决方案、解决方法或任何信息?

最佳答案

(对我而言)这很奇怪,但似乎解决办法是如何注册 IHttpContextAccessor。这并不意味着它绝对是问题的核心,但至少我可以解决问题。

同样的代码,直到最后一个字符,在两个平台上表现不同,这当然是一个问题。

因此解决方法是删除 AppHost.Configure 中的两行:

var httpContextAccessor = new HttpContextAccessor();
container.Register<IHttpContextAccessor>(httpContextAccessor);

并在 Startup.ConfigureServices 方法中注册 IHttpContextAccessor:

services.AddSingleton<IHttpContextAccessor>(new HttpContextAccessor());

...这解决了我的问题。

如果您像我一样需要在 AppHost.Configure 方法中获取 HttpContextAccessor 的实例,您可以在 Startup.Configure 中检索该实例 方法并通过构造函数将其注入(inject) AppHost 实例。检索是这样完成的:

var httpContextAccessor = (IHttpContextAccessor)app.ApplicationServices.GetService(typeof(IHttpContextAccessor));

总而言之,这很奇怪,而且肯定有某种错误,因为我可以不在 Windows 上注册它而在 Linux 上不注册它。

关于ubuntu - 在 ServiceStack.Core 中,HttpContextAccessor.HttpContext 在 Linux 上为空,而在 Windows 上为非空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47190334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com