Как и когда вызывается / выполняется метод Configuration в классе OwinStartup?
Прежде чем задать свой вопрос, я уже прошел следующие посты:
- Не удается запустить класс запуска OWIN в IIS Express после переименования файла проекта ASP.NET и всех сообщений, упомянутых в вопросе.
- OWIN Startup Detection
- OwinStartupAttribute требуется в web.config для исправления ошибки сервера # 884
- 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
проект:
- Microsoft.Owin
- Microsoft.Owin.Host.SystemWeb
- Owin
- система
- System.Core
ОБНОВЛЕНИЕ: забыл добавить сообщение об ошибке:
Сейчас,
- ПОЧЕМУ это не работает?
- Каков пошаговый процесс добавления и использования
Owin Startup
класс в очень простом проекте (например, доступ кHome/Index
)? - Как и когда используется метод конфигурации
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:
- Создать пустой проект веб-приложения
- Установите OWIN с помощью NuGet (
install-package Microsoft.Owin.Host.SystemWeb
) - Добавьте пустой класс в корень проекта с именем "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), выполните следующие действия:
- Установите MVC NuGet (
install-package Microsoft.AspNet.Mvc
). - Добавьте папку "Контроллеры" в ваш проект.
- Создайте новый пустой контроллер в новой папке "Controlles" (щелкните правой кнопкой мыши -> add -> MVC 5 Controller - Empty) и назовите его "HomeController".
- Создайте страницу просмотра в только что созданной папке "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>
- Добавить
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" });
}
- Не забудьте закомментировать вышеупомянутое промежуточное программное обеспечение "..await ctx.Response.WriteAsync...". В противном случае это будет мешать MVC.
- Запустите проект. Должно работать.
Три года спустя, но это может кому-то помочь.
Здесь дан ответ на вопрос, который вы задаете в заголовке: Параметр типа метода WebApp.Start
Класс WebApp использует отражение для получения указателя на метод Configuration(IAppBuilder), а затем вызывает его. Если класс, который вы предоставляете в качестве аргумента универсального типа, не имеет метода конфигурации с ожидаемыми аргументами, вы получите ошибку во время выполнения.