Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Вэб-приложение на Katana OWIN для теснее присутствующего сайта

Anna | 17.06.2014 | нет комментариев
В этой статье я расскажу как применить Katana OWIN к теснее присутствующему сайту на ASP NET, тот, что написан с применением WebForms, Web API и Generic Handler (*.ashx).

В сущности говоря, OWIN — это спецификация описывающая процесс обработки входящего запроса подключаемыми модулями. Всякий модуль по порядку своего следования получит запрос и будет трудиться с ним. По заключении он передаст запрос дальнейшему модулю.

Для того Дабы новое вэб-приложение на OWIN сумело исполнять надобные мне базовые функции, нужно подключить как минимум 3 модуля. У меня это: Nancy, Web API, SignalR.
Позже подключения этих модулей приложение сумеет генерировать статические страницы на html (за это отвечает Nancy), делать ajax — запросы (Web API) и трудиться с событиями и уведомлениями в настоящем времени (скажем чат) (за это отвечает модуль SignalR).

Так как все это должно трудиться под IIS, я использую реализацию спецификации OWIN Katana.

Выходит, вначале нужно установить все нужное из NuGet Gallery:

Install-Package Nancy.Owin
Install-Package Microsoft.AspNet.WebApi.Owin
Install-Package Microsoft.AspNet.SignalR

Позже установки библиотек дозволено приступить к написанию кода. По соглашению, для Katana необходим класс Startup. Позже запуска будет сделан его экземпляр и вызван способ Configuration.

using Microsoft.AspNet.SignalR;
using Microsoft.Owin;
using Nancy;
using Owin;
using System.Web.Http;

[assembly: OwinStartup(typeof(test_namespace.Startup))]
namespace test_namespace
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {      
            //SignalR
            var hubConfiguration = new HubConfiguration();
            hubConfiguration.EnableDetailedErrors = true;
            app.MapSignalR(hubConfiguration);            

            //Web API
            HttpConfiguration config = new HttpConfiguration();
            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute("def","api/{Controller}");
            config.Formatters.Remove(config.Formatters.XmlFormatter); 
            app.UseWebApi(config);

            //Nancy
            app.UseNancy(options =>
              options.PerformPassThrough = context =>
                  context.Response.StatusCode == HttpStatusCode.NotFound);
        }
    }
}

SignalR

Как видно из листинга, 1-й подключенный модуль это — SignalR. Я так же передаю добавочные параметры, Дабы включить лог ошибок. Для этого модуля также требуется определить класс, тот, что будет трудиться с уведомлениями в настоящем времени.

namespace test_namespace
{
    public class TestHub : Hub
    {
        public void send_message(string message)
        {
             Clients.All.message_to_client(message);
        }
    }
}

А также код на стороне заказчиков, тот, что мы будем включать в статическую страницу, генерируемой модулем Nancy:

    <script src="/Scripts/jquery.signalR-2.0.0.min.js"></script>
    <script src="/signalr/hubs"></script>
$(function(){
     var hub1 = $.connection.testHub; // подмечу, что testHub с крошечной буквы.
     hub1.client.message_to_client = function(s){ alert(s); }; //Функция, которую дозволено вызывать из TestHub
    $.connection.hub.logging = true; //Включаем подробнейший лог
    $.connection.hub.start().done(function () {
         hub1.server.send_message('Hello, world!').done(function(){
            console.log('сообщение было послано каждому пользователям');
        }); //вызываю функцию в TestHub, которая в свою очередь пошлет сообщение каждому заказчикам.
    });

});

В результате, позже загрузки страницы, все заказчики получат сообщение «Hello, world!».

Web API

Переходим к определению дальнейшего модуля, это Web API. Я также передаю в модуль добавочные параметры, Дабы api отдавала json-строку. Сейчас напишем класс контроллера:

public class TestController : ApiController
{
    [HttpPost]
    [HttpGet]
    [Route("api/all")]
    public object All()
    {
        return new { a = 1,b = 2, c = 4 };
    }

    public object Get()
    {
        return new { a = 1, b = 3 };
    }

}

Get запросом мы получим json с двумя переменными а и b. При «post» и «get» запросе по адресу “/api/all” получим 3 переменные a, b, c.

Nancy

Дальше перейдем к созданию класса для модуля генерации страниц Nancy. Я также передаю параметр, тот, что дозволит работать остальным страницам на моем сайте. В отвратном случае, если в модуле не будет обнаружено соответствие адресу, то заказчику придет оплошность «404 not found», невзирая на то, что, скажем, соответствующие .aspx страницы существуют.

public class TestNancy: NancyModule
{
    public TestNancy() : base("/nancy") {
        Get["/"] = _ => {
            var model = new { title = "Hello, world!" };
            return View["testpage", model];
        };
    }
}

Совместно с тем, в корне я сделаю html страницу с именем «testpage»:

<!DOCTYPE html>
<html >
<head>
  <title>@Model.title</title>
</head>
  <body>
<header>
      <h1>@Model.title</h1>
    </header>
  </body>
</html>

И, по адресу “/nancy”, я получу эту сделанную страницу с надписью «Hello, world!». Дальше, в эту страницу я включил клиентский код, тот, что делает ajax-запросы и уведомления в настоящем времени. В результате, была получена нужная базовая функциональность, это — генерация страниц, ajax-запросы и «Real time pushing» уведомления.

The Katana Project — OWIN for ASP.NET — пригодное видео про Katana.
Katana — план Katana.
OWIN — план OWIN.
SignalR — план SignalR.
Nancy with OWIN — как трудиться с Nancy и OWIN
Use OWIN to Self-Host ASP.NET Web API — как трудиться с Web API и OWIN.

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB