0

我有一个解决方案,其中包括一个胖客户端(在大多数用户界面中使用 CefSharp 实现),并且 javascript 应用程序需要在托管 CEF 浏览器的应用程序中执行一些 C# 逻辑。我考虑过使用WebView.RegisterJsObject(),但如果我只能$.ajax()从 html 页面中使用,我可以编写更少的胶水代码。

我已经为该解决方案中的 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以便我可以将某种请求对象传递给它。这甚至可能吗?

4

2 回答 2

1

您所追求的听起来类似于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 上下文,您可以使用内置的BasicRequest类,或者您自己的实现IRequest.

于 2014-03-30T05:50:25.380 回答
1

这可能是一个愚蠢的答案,但为什么不直接使用 http 呢?网络如此依赖它,即使在这种情况下(实际上没有必要),如果你使用它,事情实际上会变得更容易。

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

于 2014-03-29T20:43:50.077 回答