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
的内置基本类别。