gpt4 book ai didi

c# - 处理 servicestack Html5ModeFeature 插件中的任何默认文档类型

转载 作者:太空宇宙 更新时间:2023-11-03 13:39:40 25 4
gpt4 key购买 nike

下面的代码是 ServiceStack 插件的初始传递,以支持 angularjs 配置 $locationProvider.html5Mode(true); 当 servicestack 是自托管时(如此处要求:Routing path with ServiceStackServing default index.html page when using Angular HTML5mode and Servicestack on the backend )。我认为我有一个很好的通用解决方案,还有最后一个问题(除了将其切换为与其他插件一致的 Feature 命名约定)。

如何在我的 ProcessRequest 中一般处理任何受支持的默认文档类型?现在该功能采用 Markdown 。我希望有比关闭文件扩展名的 switch 语句更优雅的解决方案。理想情况下,我想调用一些可以继续工作的东西,因为随着时间的推移会支持更多的默认文档类型。

// This code does not yet work, and omits required methods for the sake of brevity.
// I'll update with a link to the final plugin, once I get it working.

Public Class Html5ModeHandler : IPlugin
{
private String pathInfo = String.Empty;

public void Register(IAppHost appHost)
{
appHost.CatchAllHandlers.Add((string method, string pathInfo, string filepath) =>
Factory(method, pathInfo, filepath));
}

private Html5ModeHandler(string pathInfo)
{
this.pathInfo = pathInfo;
}

Public Html5ModeHandler Factory(method, pathInfo, filepath)
{
String root = String.Empty;

// loop through catchallhandlers
if (EndpointHost.CatchAllHandlers != null)
{
foreach (var httpHandlerResolver in EndpointHost.CatchAllHandlers)
{
if (httpHandlerResolver == this.Factory) continue; // avoid infinite loop

var httpHandler = httpHandlerResolver(httpMethod, pathInfo, filePath);
if (httpHandler != null)
// only handle request if no other handler is available
return null;
}
}

if (!(GetHandlerForPathInfo(method,pathInfo, pathInfo,filepath) is NotFoundHttpHandler) )
{
// GetHandlerForPathInfo replicates most of the logic from
// ServiceStackHttpHandlerFactory.GetHandler and ServiceStackHttpHandlerFactory.GetHandlerForPathInfo
// Bail if it returns something other than a NotFoundHttpHandler

return null;
}

foreach (var defaultDoc in EndpointHost.Config.DefaultDocuments)
{
var defaultFileName = Path.Combine(Directory.GetCurrentDirectory(), defaultDoc);
if (!File.Exists(defaultFileName)) continue;
root = root ? root : (String)defaultDoc; // keep the first default document found.
}

// support HTML5Mode for Single Page App - override NotFoundHttpHandler with default document
return new Html5ModeHandler("/" + root);
}

public override void ProcessRequest(IHttpRequest httpReq, IHttpResponse httpRes, string operationName)
{
// TODO: Generalize to handle any DefaultDocument type
MarkdownHandler handler = new MarkdownHandler(this.pathInfo);
handler.ProcessRequest(httpReq, httpRes, operationName);
}
}

最佳答案

我很满意地确认没有简单的解决方案。我的 ProcessRequest 方法目前看起来像这样。

   public override void ProcessRequest(
IHttpRequest httpReq, IHttpResponse httpRes, string operationName)
{

if ( FileFormat == DefaultFileFormat.Markdown )
{
ProcessMarkdownPage(httpReq, httpRes, operationName);
return;
}

if ( FileFormat == DefaultFileFormat.Razor )
{
ProcessRazorPage(httpReq, httpRes, operationName);
return;
}

fi.Refresh();
if (fi.Exists)
{
ProcessStaticPage(httpReq, httpRes, operationName);
return;
}

ProcessServerError(httpReq, httpRes, operationName);

}

关于c# - 处理 servicestack Html5ModeFeature 插件中的任何默认文档类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17555259/

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