(барабанная дробь)
Теперь у моего велосипеда есть пример встраивания лиспа в пайплайн Asp.Net Core MVC.
В лисповом процессе поднимается Kestrel, поднимается сам фреймворк и его расширения (и скачиваются по ходу дела, если вдруг отсутствуют), и в этот пайплайн вклиниваются коллбеки на лиспе, которыми же мы производим даже всю конфигурацию.
Все на лиспе, и сервер, и модель, и вью, и контроллер, и даже небо и даже Аллах.
https://github.com/Lovesan/bike/blob/master/examples/aspnet-mvc.lisp
Вот конкретно код хендлера:
(defun process-request (request response route-data)
(declare (type dotnet-object request response route-data)
(ignore request))
"Processes a single HTTP request.
REQUEST parameter represents an instance of HttpRequest.
RESPONSE parameter is an instance of HttpResponse, which we would modify.
ROUTE-DATA represent a collection of route data parameters(a RouteData instance)."
(handler-case
;; First, retrieve the 'name' route parameter, which we have configured
;; in our CONFIGURE-ROUTES handler
;; In case of it represents a string which equals to 'None',
;; we instead utilize current user name.
(let* ((route-arg (ref (property route-data 'Values) "name"))
(who (if (string-equal route-arg "None")
(property 'Environment 'UserName)
route-arg)))
;; Set response content type
(setf (property response 'ContentType) "text/plain; encoding=utf-8")
;; Write a string to response stream. Note that the extension method
;; which we are making use of, returns a Task instance
(invoke 'HttpResponseWritingExtensions 'WriteAsync response
(format nil "Hello from AspNet.Mvc, ~a!~%Now is ~a~%"
who
(invoke (property 'DateTime 'Now) 'ToString))
(property 'CancellationToken 'None)))
(error (e)
;; Handle error in case of one occurs and return completed task
(format *error-output* "~a~%" e)
(property 'Task 'CompletedTask))))