【问题标题】:ASP.NET MVC OWIN and SignalR - two Startup.cs filesASP.NET MVC OWIN 和 SignalR - 两个 Startup.cs 文件
【发布时间】:2015-07-18 01:31:37
【问题描述】:

我的项目有问题。

我使用 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 启动程序集、类或方法,请在 web.config 中添加带有完全限定的启动类或配置方法名称的 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 = ""
            //});
        }
    }
}

【问题讨论】:

  • 我需要两个类 - 一个用于身份验证,另一个用于 SignalR
  • 不能把所有的配置内容放在一个方法里,用2个属性吗?例如[程序集:OwinStartupAttribute(typeof(MCWeb_3SR.Startup))] [程序集:OwinStartup(typeof(MCWeb_3SR.Startup))]
  • 我之前尝试过,但如果我无法从根 Startup.cs 访问 App_Code 文件夹,并且我无法从另一个文件夹获取 ConfigureAuth(app)。

标签: c# asp.net asp.net-mvc signalr owin


【解决方案1】:

将信号器启动文件移动到 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 部分类都具有相同的命名空间,这应该可以工作。

【讨论】:

    【解决方案2】:

    您能否将两组代码放入一个单独的 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();
            }
        }
    }
    

    【讨论】:

    • 我得到当前上下文中不存在名称“ConfigureAuth”
    • 我无法将它们都放在 App_Code 文件夹中的一个文件中,因为无法从那里访问 App_Start 并且 ConfigureAuth(app) 需要它。我尝试修改这两个文件以包含公共部分类 Startup,但我得到“V:\MCWeb-3SR\App_Code\Startup.cs”中的“MCWeb_3SR.Startup”类型与“V:”中导入的“MCWeb_3SR.Startup”类型冲突: \MCWeb-3SR\'。使用“V:\MCWeb-3SR\App_Code\Startup.cs”中定义的类型。 V:\MCWeb-3SR\App_Code\Startup.cs
    猜你喜欢
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2010-10-05
    • 2017-05-12
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多