Как и когда вызывается / выполняется метод Configuration в классе OwinStartup?

Прежде чем задать свой вопрос, я уже прошел следующие посты:

  1. Не удается запустить класс запуска OWIN в IIS Express после переименования файла проекта ASP.NET и всех сообщений, упомянутых в вопросе.
  2. OWIN Startup Detection
  3. OwinStartupAttribute требуется в web.config для исправления ошибки сервера # 884
  4. OWIN Класс запуска не обнаружен

Вот макет папки моего проекта:


В настоящее время нет контроллера или просмотра. Просто Owin Startup файл.


Startup.cs

using System;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(Bootstrapper.Startup))]

namespace Bootstrapper
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Run(async context =>
            {
                await context.Response.WriteAsync(GetTime() + " My First OWIN App");
            });
        }

        string GetTime()
        {
            return DateTime.Now.Millisecond.ToString();
        }
    }
}


Web.config

<appSettings>
    <add key="owin:AutomaticAppStartup" value="true" />
    <add key="owin:appStartup" value="Bootstrapper.Startup" />
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>


У меня есть следующая ссылка в Bootstrapper проект:

  1. Microsoft.Owin
  2. Microsoft.Owin.Host.SystemWeb
  3. Owin
  4. система
  5. System.Core


ОБНОВЛЕНИЕ: забыл добавить сообщение об ошибке:


Сейчас,

  1. ПОЧЕМУ это не работает?
  2. Каков пошаговый процесс добавления и использования Owin Startup класс в очень простом проекте (например, доступ к Home/Index)?
  3. Как и когда используется метод конфигурации Owin Startup класс называется / исполняется?


ОБНОВЛЕНИЕ: 10 декабря 2016 года

Проверить Project-Folder-Layout, В Bootstrapper Проект у меня есть следующий файл:
IocConfig.cs

[assembly: PreApplicationStartMethod(typeof(IocConfig), "RegisterDependencies")]

namespace Bootstrapper
{
    public class IocConfig
    {
        public static void RegisterDependencies()
        {
            var builder = new ContainerBuilder();

            builder.RegisterControllers(typeof(MvcApplication).Assembly);
            builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
            builder.RegisterModule<AutofacWebTypesModule>();

            builder.RegisterType(typeof(MovieService)).As(typeof(IMovieService)).InstancePerRequest();
            builder.RegisterType(typeof(MovieRepository)).As(typeof(IMovieRepository)).InstancePerRequest();

            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }
    }
}

Теперь я хочу выполнить IocConfig.RegisterDependencies() в OWIN Startup учебный класс. я делаю using Bootstrapper в Startup наверху, но это не работает. Я имею в виду, я не могу ссылаться IocConfig в Startup, Как решить это?

2 ответа

Решение

Немного поздно, но я нашел решение, как поместить класс запуска OWIN в отдельный проект. Все, что вы сделали в своем проекте, правильно, вы должны применить только одно изменение в свойствах вашего проекта Bootstrapper. Щелкните правой кнопкой мыши по проекту Bootstrapper, введите свойства, перейдите на вкладку Build и найдите путь к выходу. Вы должны увидеть стандартный выходной патч bin \ debug \, который означает, что ваша DLL Bootstrapper попадет в эту папку. Вы должны изменить это в папку bin, где находится все ваше веб-приложение.

Например, я создал простое решение с двумя проектами, первый - пустое веб-приложение, а второй - библиотека с классом запуска OWIN. В свойствах второго проекта я изменил путь вывода на.. \ OwinTest.Web \ bin. Это приведет к тому, что после сборки все dll попадут в одну папку. Теперь вы можете запустить ваше приложение, и OWIN Startup должен работать правильно.

Ниже приведен экран настроек свойств проекта Bootstrapper:

  1. Создать пустой проект веб-приложения
  2. Установите OWIN с помощью NuGet (install-package Microsoft.Owin.Host.SystemWeb)
  3. Добавьте пустой класс в корень проекта с именем "Startup.cs"

Здесь я отвечу на ваш третий вопрос. Класс запуска является точкой входа в OWIN и ищется автоматически. Как указано в официальных документах:

Соглашение об именах: Katana ищет класс с именем Startup в пространстве имен, соответствующем имени сборки или глобальному пространству имен.

Обратите внимание, что вы также можете выбрать собственное имя класса Startup, но вы должны установить его с помощью декораторов или AppConfig. Как указано здесь: https://www.asp.net/aspnet/overview/owin-and-katana/owin-startup-class-detection

Это все, что вам нужно для базового и рабочего теста OWIN:

using Owin;
using System;

namespace OwinTest
{
    public class Startup
    {
        public static void Configuration(IAppBuilder app)
        {
            app.Use(async (ctx, next) =>
            {
                await ctx.Response.WriteAsync(DateTime.Now.ToString() + " My First OWIN App");
            });
        }
    }
}

Если вы хотите использовать MVC (я полагаю, под "Home/Index" вы подразумеваете MVC), выполните следующие действия:

  1. Установите MVC NuGet (install-package Microsoft.AspNet.Mvc).
  2. Добавьте папку "Контроллеры" в ваш проект.
  3. Создайте новый пустой контроллер в новой папке "Controlles" (щелкните правой кнопкой мыши -> add -> MVC 5 Controller - Empty) и назовите его "HomeController".
  4. Создайте страницу просмотра в только что созданной папке "Views/Home". Щелкните правой кнопкой мыши -> Добавить -> Просмотр. Назовите его "Индекс" и снимите флажок "Использовать страницу макета".

Сделайте страницу наследуемой от WebViewPage. Все должно выглядеть так:

@inherits System.Web.Mvc.WebViewPage
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div> 
        <h1>Owin Hello</h1>
    </div>
</body>
</html>
  1. Добавить global.asax настроить маршруты. Щелкните правой кнопкой мыши по проекту -> Добавить -> Новый элемент -> Глобальный класс приложений.

Добавьте определение маршрутов в метод Application_Start:

protected void Application_Start(object sender, EventArgs e)
{
    RouteTable.Routes.MapRoute(name: "Default",
        url: "{controller}/{action}",
        defaults: new { controller = "Home", action = "Index" });
}
  1. Не забудьте закомментировать вышеупомянутое промежуточное программное обеспечение "..await ctx.Response.WriteAsync...". В противном случае это будет мешать MVC.
  2. Запустите проект. Должно работать.

Класс WebApp использует отражение для получения указателя на метод Configuration(IAppBuilder), а затем вызывает его. Если класс, который вы предоставляете в качестве аргумента универсального типа, не имеет метода конфигурации с ожидаемыми аргументами, вы получите ошибку во время выполнения.

Другие вопросы по тегам