Могу ли я расширить ServiceStackHost для обработки запросов от браузера CEF в моем приложении?

У меня есть решение, которое включает в себя толстый клиент (реализованный с помощью CefSharp для большей части пользовательского интерфейса), и приложение javascript должно выполнять некоторую логику C # в приложении, на котором размещен браузер CEF. Я рассматривал возможность использования WebView.RegisterJsObject(), но я смогу написать меньше связующего кода, если смогу просто использовать $.ajax() на html-страницах.

У меня уже настроен 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 поэтому я могу передать ему какой-то объект запроса. Это вообще возможно?


person Zachary Yates    schedule 12.03.2014    source источник


Ответы (2)


Это может быть глупый ответ, но почему бы просто не использовать http? Интернет настолько сильно основан на нем, что на самом деле все становится проще, если вы используете его даже в таких случаях (где это на самом деле не нужно).

Если это не так, вы можете реализовать собственный обработчик схемы, который направляет запросы к foo://bar в ваш код C# и делать все, что вам нравится. В CefSharp.Wpf.Example есть пример обработчика пользовательской схемы, поэтому он должен помочь вам в этом.

person Per Lundberg    schedule 29.03.2014
comment
Ну, мы не можем указать приложению реальный http-сервер, потому что оно должно работать в «отключенном» режиме. Я был обеспокоен тем, что запуск http-сервера на клиенте сделает программу установки неуправляемой (если, например, что-то уже запущено на клиенте, который прослушивает порт 80). У меня работает обработчик схем, и это было не так уж сложно, но мы все равно можем использовать http, если нам нужно будет интегрироваться с другим программным обеспечением на ПК. - person Zachary Yates; 31.03.2014

То, что вам нужно, похоже на то, как Серверы 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.

person mythz    schedule 30.03.2014