ServiceStack:将索引页面的根URL设置为/

时间:2014-05-29 10:12:51

标签: c# servicestack servicestack-bsd

几个星期前我问了一个关于此的问题,在这里找到:ServiceStack: URL Re-writing with Self-Hosted application

但是,当我将此应用程序创建为Windows服务时,我遇到了一个问题。当我浏览应用程序的根URL时出现以下错误:

error CodeFileNotFoundExceptionmessage
Could not find file 'C:\Windows\system32\index.html'.

这就是我所做的:

var handleRoot = new CustomActionHandler((httpReq, httpRes) =>
{
    httpRes.ContentType = "text/html";
    httpRes.WriteFile("index.html");
    httpRes.End();
});

SetConfig(new EndpointHostConfig
{
    DebugMode = false,
    RawHttpHandlers =
    {
        httpReq => (httpReq.RawUrl == "/") ? handleRoot : null
    }
});

public class CustomActionHandler : IServiceStackHttpHandler, IHttpHandler
{
    public Action<IHttpRequest, IHttpResponse> Action { get; set; }

    public CustomActionHandler(Action<IHttpRequest, IHttpResponse> action)
    {
        if (action == null)
            throw new Exception("Action was not supplied to ActionHandler");

        Action = action;
    }

    public void ProcessRequest(IHttpRequest httpReq, IHttpResponse httpRes, string operationName)
    {
        Action(httpReq, httpRes);
    }

    public void ProcessRequest(HttpContext context)
    {
        ProcessRequest(context.Request.ToRequest(GetType().Name),
            context.Response.ToResponse(),
            GetType().Name);
    }

    public bool IsReusable
    {
        get { return false; }
    }
}

如果我拿出来并浏览我的服务的根目录,它可以正常工作,但我已经/index.html附加到了我希望它/的末尾,就像我主持这个时一样作为控制台应用程序

1 个答案:

答案 0 :(得分:3)

当您作为Windows服务运行时,服务的执行目录将成为系统的System32文件夹,因为这是服务DLL主机执行的位置。

这意味着它将成为ServiceStack应用程序的基本目录。因此,如果您执行httpRes.WriteFile("index.html");,它会在index.html中查找c:\windows\system32\,并且看到您的index.html不会驻留在那里,它将找不到索引。

您可以通过以下两种方式之一解决此问题。您可以设置将从中读取文件的基目录;或者,您可以在选择要写入的文件时指定完整路径。

设置当前目录:

您可以通过在应用程序启动时包含此行来将目录更改为正在执行的服务程序集而不是系统目录。

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);
...
httpRes.WriteFile("index.html"); // index.html is read from the application directory now

获取应用程序目录:

或者您可以确定应用程序目录并将其与index.html组合以形成完整路径。

var directory = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
httpRes.WriteFile(Path.Combine(directory, "index.html"));