ServiceStack自托管站点默认页面

3
我尝试了所有自托管和servicestack的Razor模板,在这些项目中,如果安装了razorFormat,就可以提供静态html和cshtml。但我不知道哪里出了问题,我只是把代码复制到新的解决方案中,但无法让html响应起作用。我总能得到元数据页面并且服务也正常运行,但我无法添加default.htm并使其正常工作。 如果我输入http://localhost:1337,应该被重定向到默认页面。也许我错过了什么,但我不知道是什么。如果有人能帮帮我,我将非常感激!
这是我的default.htm。
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>
        <title></title>
    </head>
    <body>
    SOMETEXT
    </body>
</html>

这是我的程序。
class Program
    {
        [Route("/hello")]
        [Route("/hello/{Name}")]
        public class Hello
        {
            public string Name { get; set; }
        }

        public class HelloResponse
        {
            public string Result { get; set; }
        }

        public class HelloService : Service
        {
            public object Any(Hello request)
            {
                return new HelloResponse { Result = "Hello, " + request.Name };
            }
        }

        public class AppHost : AppHostHttpListenerBase {
            public AppHost() : base("StarterTemplate HttpListener",                             typeof(HelloService).Assembly) {
            }

            public override void Configure(Funq.Container container) {
                container.Register(new HelloService());
            }    
        }

        static void Main(string[] args)
        {
            var listeningOn = args.Length == 0 ? "http://*:1337/" : args[0];
            var appHost = new AppHost();
            appHost.Init();
            appHost.Start(listeningOn);

            Console.WriteLine("AppHost Created at {0}, listening on {1}", DateTime.Now, listeningOn);
            Console.ReadKey();
        }
    }

编辑:

我应该补充说明我得到的回应是什么。


Handler for Request not found: 


Request.HttpMethod: GET
Request.HttpMethod: GET
Request.PathInfo: /default.htm
Request.QueryString: 
Request.RawUrl: /default.htm

我尝试的另一件事是在AppHostHttpListenerBase.Configure中放置请求过滤器。在我的项目中,我甚至没有触发它,但在模板项目中却可以。

编辑: 我发现问题在于我的Default.html和app.Config文件没有被移动到bin/Debug目录中。有人遇到过这个问题吗?


ServiceStack的示例不使用Razor视图页面(*.cshtml)吗?试着将default.html改为default.cshtml - Jesse Webb
我也尝试过了。如果我不使用 Razor,我仍然应该让 default.htm 起作用。但是在我的其他项目中(那是一个空的 ASP.NET 项目),没有这个问题。我希望能够灵活地自托管,这样我就可以选择作为服务或 Linux 守护程序运行。 - Nick H
1
你需要将所有希望自动复制到 /bin 目录中的内容文件的“Build-Action”设置为“Copy if Newer”。 - mythz
感谢您的帮助,mythz。在我最后一次编辑后不久,我意识到那是我的问题所在。现在我想起来了,我甚至记得在某个地方读到过这是必要的(可能是您的帖子),只是没有注册。再次感谢您的帮助和出色的框架! - Nick H
2个回答

1

这里有一篇很好的博客文章,讲述如何为自托管/控制台应用程序提供Razor页面服务。我认为你不需要一个app.config或者web.config文件,虽然我可能是错的。

我认为你忽略了两件事情:

1)在你的AppHost的Configure方法中添加Plugins.Add(new RazorFormat())
2)将Razor文件的“复制到输出目录”值更改为“如果较新则复制”(这是文件的属性设置中的选项)。此外,将你的default.htm文件更改为default.cshtml


感谢你的帮助,paaschpa。你关于“复制到输出目录”的观点绝对正确。不过我认为你在第一个方面是错误的。Servicestack无论文件是default.htm还是default.cshtml都没有关系。包含RazorFormat插件的唯一原因是如果你将使用Razor。ServiceStack可以以任何方式提供内容页面。 - Nick H

0
在 OS X 中使用 Xamarin,“复制到输出目录”一定会让人非常头疼,因为你需要为每个文件选择此选项,有时候还要选择两次。所以另一个选项就是创建符号链接。
ln -s /path_to_project/assets /path_to_project/bin/Debug/assets 
ln -s /path_to_project/Views /path_to_project/bin/Debug/Views 

对于 assets 文件夹中的数百个文件来说非常有用,而对于 Views 文件夹来说稍微简单一些。

在 Linux 主机上可以通过将 selfhost.exe 和 *.dll 隐藏在 bin 文件夹中来实现相同效果


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接