• ServiceStack.RabbitMQ在站点中使用时导致静态页面无法正常解析


    当站点中集成ServiceStack.RabbitMQ时快速处理异步请求时,官方建议初始化如下:

    public class AppHost : AppHostHttpListenerBase
    {
        public AppHost() : base("Rabbit MQ Test Host", typeof(HelloService).Assembly) {}
    
        public override void Configure(Container container)
        {
            container.Register<IMessageService>(c => new RabbitMqServer());
    
            var mqServer = container.Resolve<IMessageService>();
    
            mqServer.RegisterHandler<Hello>(ExecuteMessage);
            mqServer.Start();
        }
    }


    https://github.com/ServiceStack/ServiceStack/wiki/Rabbit-MQ

    而当我们默认将此启动程序放入asp.net站点里的global.asa里:

    protected void Application_Start(object sender, EventArgs e)
            {
                new AppHost().Init();
            }
    会发现默认的站点里的静态页面无法运行了,经过分析发现:
    ServiceStack.HostConfig初始化时,其属性出现问题了
    WebHostPhysicalPath = "~".MapServerPath(),
    深入看一下MapServerPath的详细实现
    public static string MapServerPath(this string relativePath)
            {
                return HostContext.IsAspNetHost
                    ? relativePath.MapHostAbsolutePath()
                    : relativePath.MapAbsolutePath();
            }
    public static bool IsAspNetHost
            {
                get { return ServiceStackHost.Instance is AppHostBase; }
            }
    
    
    看到这里应该发现了,这个方法判断引起的,因为当前初化的是ServiceStack.AppHostHttpListenerBase,导致HostConfig.WebHostPhysicalPath 的值是不正确的,指向了站点in目录了,导致正常的静态资源得不到正确处理。

    找到原因了,解决这个问题也就容易多了,直接在上面的初始化方法里加一句:
    var cfg = new HostConfig();
    cfg.WebHostPhysicalPath = "~".MapAbsolutePath();
    SetConfig(cfg);
    
    
    
    
    
    
    
    
    
    
    
    
    
  • 相关阅读:
    C语言:SQLITE3的学习
    C语言:json库使用学习
    C语言:XML学习
    glib实践篇:接口定义与实现
    glib实践篇:父类与子类
    python简易爬虫实现
    Esxi开虚拟机测试性能
    Hyper-V虚拟化性能测试
    配置飞儿云平台的PHP系统
    CentOS6.9安装OpenVZ
  • 原文地址:https://www.cnblogs.com/yulinlover/p/5985656.html
Copyright © 2020-2023  润新知