我可以扩展ServiceStackHost以处理我应用程序中CEF浏览器的请求吗?



i有一个解决方案,其中包括一个厚客户端(使用CEFSHARP用于大多数用户界面),并且JavaScript应用程序需要在应用程序托管的应用程序中执行某些C#逻辑。我考虑使用WebView.RegisterJsObject(),但是如果我只能在HTML页面中使用$.ajax(),我可以更少编写胶水代码。

我已经在此解决方案中已经设置了Web服务和Web客户端的ServiceStack。我想将请求从CEF浏览器路由到本地ServiceStack主机(不实际使用HTTP)。

这是一些伪造的代码,可以说明我想做什么:

public partial class MainWindow : IRequestHandler {
  WebView _webView;
  CefSharpServiceStackHost _serviceHost;
  public MainWindow() {
    // initialize CefSharp...
    _webView.RequestHandler = this;
    // initialize ServiceStackHost...
  }
  // other IRequestHandler methods...
  // method this intercepts ajax calls from the CEF browser
  public bool OnBeforeResourceLoad(IWebBrowser browser, IRequestResponse requestResponse) {
    // translate CefSharp.IRequestResponse to ServiceStack.IRequest or HttpRequest
    // should execute HelloService.Any() for the requestResponse.Url = "/hello/Zach"
    var response = _serviceHost.ExecuteService(Translate(requestResponse));
    requestResponse.RespondWith(response.Stream);
    return false;
  }
}
[Route("/hello/{Name}")]
public class Hello {
  public string Hello { get; set; }
}
public class HelloService {
  public object Any(Hello request) { // ... }
}

我不知道的部分是如何扩展ServiceStackHost,以便我可以将某种请求对象传递给它。这甚至可能吗?

这可能是一个愚蠢的答案,但是为什么不反正使用HTTP呢?网络非常基于它,即使在这样的情况下,您也会使用它实际上会变得更容易(在这种情况下并不是必要的)。

如果这不行,您可以实现一个自定义方案处理程序,该计划处理程序将请求 foo://bar路由到C#代码,然后做任何您喜欢的事情。CefSharp.Wpf.Example有一个示例自定义方案处理程序,因此应该在此过程中为您提供帮助。

您所追求的声音与MQ服务器在ServiceStack中如何执行服务相似,只需将消息路由至:

ServiceController.ExecuteMessage(IMessage)

在ServiceController上有许多其他API您可以在ServiceStack中执行请求:

//Execute the Request DTO with an empty Request context:
object Execute(object requestDto)
//Execute the Request DTO with the supplied Request context:
object Execute(object requestDto, IRequest request)

对于Irequest上下文,您可以使用内置的基本雷克斯类或实现IRequest的内置基本类别。

最新更新