SignalR / signalr / hubs 403在MVC 5应用程序上找不到(个人用户帐户身份验证)

时间:2016-04-30 11:20:45

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

我已经基于个人用户身份验证创建了MVC 5 Web应用程序。

我已阅读asp.net文章  http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr-and-mvc表示不需要为单个用户身份验证类型应用程序单独创建startup.cs。 所以我在ConfigureAuth方法中添加 app.MapSignalR(); 驻留在 App_Start> Startup.Auth.cs 文件中。

    public void ConfigureAuth(IAppBuilder app)
    {           
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login")
        });           app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
        app.MapSignalR();}

在视图页面中,我添加了以下参考

<script src="~/Scripts/jquery.signalR-2.2.0.min.js"></script>
<script src="~/signalr/hubs"></script>

但是在运行时我得到/ Signalr / hubs js文件的403 Not found错误。 如何解决它。

2 个答案:

答案 0 :(得分:0)

您确定已拨打app.MapSignalR()吗?

我不确定它是否应该与ConfigureAuth中的此命令一起使用,但我会尝试创建一个单独的启动文件,如文章中所述:

using Owin;
using Microsoft.Owin;
[assembly: OwinStartup(typeof(SignalRChat.Startup))]
namespace SignalRChat
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Any connection or hub wire up and configuration should go here
            app.MapSignalR();
        }
    }
}

尝试将其放在单独的文件中,看看它是否适合您。

另外,您的Application_Start方法是这样的吗?

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        RouteTable.Routes.MapHubs();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }
}

我发现您调用注册方法的顺序很重要,因此请确保您已正确放置它们并且已调用RouteTable.Routes.MapHubs()方法。

答案 1 :(得分:0)

我已经尝试了这个并且有效。

这是我的示例应用程序

cshtml文件

<script type="text/javascript" src="~/scripts/jquery.signalR-2.2.0.js"></script>
<script type="text/javascript" src="~/signalr/hubs"></script>
<script>
    $(function () {
        debugger;
        var chat = $.connection.signalhub;
        chat.client.Send = function (msg) {
            debugger;
            $("#message").append(msg);
        }

        $("#btnSend").click(function () {
            debugger;
            chat.server.broadcastMessage($("#txtmessage").val());
            $('#txtmessage').val('').focus();
        });

        $.connection.hub.start();
    });
</script>
<div class="row" id="message">

</div>
<input type="text" name="txtmessage" id="txtmessage" />
<button name="btnSend" id="btnSend">Send</button>

这是我的SignalRHub

using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;

namespace SignalR.Code
{
    [HubName("signalhub")]
    public class SignalRHub : Hub
    {
        public void BroadcastMessage(string message)
        {            
            Clients.Client(Context.ConnectionId).Send(message);
        }
    }
}

这是我的Startup.Auth.cs文件

using Microsoft.AspNet.Identity;
using Microsoft.Owin;
using Microsoft.Owin.Security.Cookies;
using Owin;

namespace SignalR
{
    public partial class Startup
    {
        public void ConfigureAuth(IAppBuilder app)
        {
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login")
            });

            app.MapSignalR();

            app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
        }
    }
}

另外我建议您查看您使用的JQuery版本,并确定您的项目在哪个位置?

相关问题