ASP.NET MVC OWIN 和 SignalR - 两个 Startup.cs 文件

ASP.NET MVC OWIN and SignalR - two Startup.cs files

我的项目有问题。

我使用 ASP.NET MVC 和 ASP.NET Identity 2.0 进行身份验证,并将 SignalR 添加到项目中,所以现在我有两个 Startup.cs 文件:

第一个来自根目录中的 MVC

[assembly: OwinStartupAttribute(typeof(MCWeb_3SR.Startup))]
namespace MCWeb_3SR
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);

        }
    }
}

AppCode 文件夹中有一个 SignalR

[assembly: OwinStartup(typeof(SignalRChat.Startup))]
namespace SignalRChat
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {

            var heartBeat = GlobalHost.DependencyResolver.Resolve<ITransportHeartbeat>();

            var monitor = new PresenceMonitor(heartBeat);
            monitor.StartMonitoring();


            // Any connection or hub wire up and configuration should go here
            app.MapSignalR();
        }
    }
}

但我收到以下错误

尝试加载应用程序时出现以下错误。 - 在引用启动类型 'MCWeb_3SR.Startup' 的程序集 'MCWeb-3SR' 中发现的 OwinStartup 属性与引用启动类型 'SignalRChat.ChatStartup' 的程序集 'App_Code.hszoxs_z' 中的属性冲突,因为它们具有相同的 FriendlyName ''。删除或重命名其中一个属性,或直接引用所需的类型。 要禁用 OWIN 启动发现,请在 web.config 中添加值为 "false" 的 appSetting owin:AutomaticAppStartup。 要指定 OWIN 启动程序集、Class 或方法,请在 web.config.[=16= 中添加具有完全限定启动 class 或配置方法名称的 appSetting owin:AppStartup ]

我试过添加

[assembly: OwinStartupAttribute("ProductionConfiguration.st", typeof(MCWeb_3SR.Startup))]

到第一个,第 运行 页,但身份验证不起作用。

我怎样才能让他们 运行 在一起?

更新

using System;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin;
using Microsoft.Owin.Security.Cookies;
using Microsoft.Owin.Security.Google;
using Owin;
using MCWeb_3SR.Models;

namespace MCWeb_3SR
{
    public partial class Startup
    {
        // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
        public void ConfigureAuth(IAppBuilder app)
        {
            // Configure the db context, user manager and signin manager to use a single instance per request
            app.CreatePerOwinContext(ApplicationDbContext.Create);
            app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
            app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

            // Enable the application to use a cookie to store information for the signed in user
            // and to use a cookie to temporarily store information about a user logging in with a third party login provider
            // Configure the sign in cookie
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login"),
                Provider = new CookieAuthenticationProvider
                {
                    // Enables the application to validate the security stamp when the user logs in.
                    // This is a security feature which is used when you change a password or add an external login to your account.  
                    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                        validateInterval: TimeSpan.FromMinutes(30),
                        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
                }
            });            
            app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

            // Enables the application to temporarily store user information when they are verifying the second factor in the two-factor authentication process.
            app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));

            // Enables the application to remember the second login verification factor such as phone or email.
            // Once you check this option, your second step of verification during the login process will be remembered on the device where you logged in from.
            // This is similar to the RememberMe option when you log in.
            app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);

            // Uncomment the following lines to enable logging in with third party login providers
            //app.UseMicrosoftAccountAuthentication(
            //    clientId: "",
            //    clientSecret: "");

            //app.UseTwitterAuthentication(
            //   consumerKey: "",
            //   consumerSecret: "");

            //app.UseFacebookAuthentication(
            //   appId: "",
            //   appSecret: "");

            //app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
            //{
            //    ClientId = "",
            //    ClientSecret = ""
            //});
        }
    }
}

你能把两组代码放到一个单独的 OwinStartup 文件中吗?

namespace MCWeb_3SR
{
    public class OwinStartup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);

            var heartBeat = GlobalHost.DependencyResolver.Resolve<ITransportHeartbeat>();
            var monitor = new PresenceMonitor(heartBeat);
            monitor.StartMonitoring();

            // Any connection or hub wire up and configuration should go here
            app.MapSignalR();
        }
    }
}

将信号器启动文件移动到 App_Start 文件夹并将其重命名为 Startup.SignalR.cs。它应该有这个内容,注意 Configure 方法已重命名为 ConfigureSignalR:

namespace MCWeb_3SR
{
  public partial class Startup
  {
    public void ConfigureSignalR(IAppBuilder app) {
      var heartBeat = GlobalHost.DependencyResolver.Resolve<ITransportHeartbeat>(); 

      var monitor = new PresenceMonitor(heartBeat); 
      monitor.StartMonitoring(); 


      // Any connection or hub wire up and configuration should go here 
      app.MapSignalR();
    }
  }
}

现在,在项目根目录的 Startup.cs 文件中,在 ConfigureAuth(app) 之后添加一个 ConfigureSignalR(app) 调用:

[assembly: OwinStartup(typeof(MCWeb_3SR.Startup))]
namespace MCWeb_3SR
{
  public partial class Startup
  {
    public void Configuration(IAppBuilder app) {
      ConfigureAuth(app);
      ConfigureSignalR(app);
    }
  }
}

只要所有 Startup 部分 类 具有相同的命名空间,这应该可行。