2016-12-09 30 views
4

之前,我問我的問題我已經通過下面的帖子不見了:在問題中提到OwinStartup類中的Configuration方法何時調用/執行?

  1. Can't get the OWIN Startup class to run in IIS Express after renaming ASP.NET project file和所有的職位。
  2. OWIN Startup Detection
  3. OwinStartupAttribute required in web.config to correct Server Error #884
  4. OWIN Startup class not detected

這裏是我的項目的文件夾佈局:

enter image description here
目前沒有控制器或者視圖。只是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程序


UPDATE: 忘了補充錯誤消息:

enter image description here


現在,

  1. 爲什麼是它不工作?
  2. 什麼是添加在一個非常基本的項目(比如訪問Home/Index)使用Owin Startup類的一步一步的過程?
  3. 如何以及何時在Owin Startup類的配置方法是 名爲/執行?


UPDATE: 10日 - 12月-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)); 
     } 
    } 
} 

現在我想在OWIN Startup類來執行IocConfig.RegisterDependencies()。我在Startup頂部using Bootstrapper,但它不起作用。我的意思是我無法在Startup中引用IocConfig。如何解決這個問題?

回答

0

這有點晚,但我發現解決方案如何將OWIN啓動類放在單獨的項目中。您在項目中完成的所有操作都是正確的,您只能對Bootstrapper項目的屬性應用一個更改。右鍵單擊Bootstrapper項目,輸入屬性,單擊生成選項卡並查找輸出路徑。您應該看到標準輸出補丁bin \ debug \,這意味着您的Bootstrapper DLL將落在此文件夾中。您必須將其更改爲您的整個網絡應用程序所在的bin文件夾。

例如,我創建了兩個項目的簡單解決方案,首先是一個空的Web應用程序,第二個是帶有OWIN Startup類的庫。在第二個項目的屬性中,我將輸出路徑更改爲.. \ OwinTest.Web \ bin。這將會導致在構建完所有dll之後,它們將落入一個文件夾中。您現在可以運行您的應用程序,並且OWIN Startup應該正常工作。

下面是引導程序項目的屬性設置畫面:

enter image description here

+0

如果我沒有錯,這是我們所說的bootstrapping?將OWIN啓動文件引導到項目以外的其他項目? – barnes

+1

老實說,我不知道很激動,但是我在一個關於什麼是引導的問題上找到了這個答案:https://stackoverflow.com/a/1255796/3872681。基於這個答案,我認爲,在web應用程序中引導意味着在真正的應用程序啓動之前加載所有的輔助框架,例如IoC容器或ASP.NET Identity模塊,所以OWIN本身就是一個引導程序。因此,移動OWIN啓動文件的項目稱爲bootstrapper,因爲它包含所有OWIN模塊,而不是您在此引導的OWIN模塊。但我不是100%確定的。 –

5
  1. 創建一個空的Web應用程序項目
  2. 的OWIN使用的NuGet(install-package Microsoft.Owin.Host.SystemWeb
  3. 添加一個空的類成所謂的 「Startup.cs」 項目的根

在這裏,我會回答安裝你的第三個問題。啓動類是OWIN的入口點,正在自動查找。作爲官方的文檔說明:

命名約定:武士刀尋找一個名字空間 命名啓動類匹配的組件名稱或全局命名空間。

請注意,您也可以選擇自己的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(我想通過「首頁/索引」你的意思是MVC ),請按照下列步驟操作:

  1. 安裝MVC NuGet(install-package Microsoft.AspNet.Mvc)。
  2. 將「控制器」文件夾添加到您的項目中。
  3. 在新的「Controlles」文件夾(右鍵單擊 - >添加 - > MVC 5控制器 - 空)下創建一個新的空控制器,並將其命名爲「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> 
  • 添加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。
  • 運行該項目。應該工作。
  • +0

    如果我違抗第三點'添加一個空的類成所謂的「Startup.cs」'項目的根?我的意思是我添加了一個啓動類,但不在根目錄中,而是按照我提出的問題的方式進行。看看'project-folder-layout'以供參考。 – barnes

    +0

    @barnes然後你會得到'System.EntryPointNotFoundException'異常。 OWIN只需要一個入口點。 –

    +0

    我從來沒有看到這個異常,而是在每次調用時調用'Global.asax'中的'Application_Start()'。沒有例外被拋出。後來我將我的'Startup'文件移動到項目(Mvc),然後開始執行。 – barnes

    相關問題