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

Posted 发明轮子的意义是可以更好的理解轮子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 的值是不正确的,指向了站点\bin目录了,导致正常的静态资源得不到正确处理。

找到原因了,解决这个问题也就容易多了,直接在上面的初始化方法里加一句:
var cfg = new HostConfig();
cfg.WebHostPhysicalPath = "~".MapAbsolutePath();
SetConfig(cfg);

 


 



 

以上是关于ServiceStack.RabbitMQ在站点中使用时导致静态页面无法正常解析的主要内容,如果未能解决你的问题,请参考以下文章

通过 BroadLeaf 管理站点添加了类别,但无法在站点中查看

Nginx 没有在启用的站点中拾取站点?

如何在由“站点”框架提供支持的多个 Django 站点中获取唯一用户?

php 在WordPress多站点网络中获取主站点的博客ID

如何在多站点网络中显示主站点的主菜单

如何在 django 模板中获取站点名称?