如何使用SignalR在Azure移动服务.Net后端启用JsonP

时间:2016-04-19 14:16:07

标签: cordova cors signalr jsonp azure-mobile-services

我正在尝试从Apache Cordova应用程序访问Azure移动服务中托管的SignalR,同时启动集线器连接时出现错误403 Forbidden:在使用Web套接字协议的协商请求中禁用JSONP。 我尝试添加EnableJsonP如下所示,但它仍然提出相同的问题,是否有任何其他方法来启用azze托管移动服务。

public static class WebApiConfig
{
    public static void Register()
    {
        SignalRExtensionConfig.Initialize();

        // Use this class to set configuration options for your mobile service
        ConfigOptions options = new ConfigOptions();
        options.SetRealtimeAuthorization(AuthorizationLevel.Anonymous);

        //// Use this class to set WebAPI configuration options
        var configBuilder = new ConfigBuilder(options, (httpconfig, ioc) =>
        {
            ioc.RegisterInstance(new CORSSignalROwinAppBuilderExtension(httpconfig)).As<IOwinAppBuilderExtension>();
        });
        HttpConfiguration config = ServiceConfig.Initialize(configBuilder);
        config.Formatters.JsonFormatter.SerializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include;
        config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include;

        Database.SetInitializer(new snackappmobileInitializer());
    }
}

internal class CORSSignalROwinAppBuilderExtension : OwinAppBuilderExtension
{
    private HttpConfiguration httpconfig;

    protected override void ConfigureSignalR(IAppBuilder appBuilder)
    {
        appBuilder.Map("/signalr", map =>
        {
            var hubConfiguration = new HubConfiguration
            {
                EnableJSONP = true
            };
            map.RunSignalR(hubConfiguration);
        });
        base.ConfigureSignalR(appBuilder);
    }

    public CORSSignalROwinAppBuilderExtension(HttpConfiguration httpconfig) : base(httpconfig)
    {
        this.httpconfig = httpconfig;
    }
}

1 个答案:

答案 0 :(得分:0)

使用Azure Mobile有两种不同的方式 - 应用服务和移动服务。如果您在经典门户中进行配置(https://manage.windowsazure.com),那么您正在使用移动服务。如果没有,您就在App Service中。基于这个问题,我的信念是你正在使用移动服务,所以如果你还在开发的话,我建议升级 - 改用App Service!

App Service对SignalR没有做任何特殊处理,因此所有“正常”的SignalR内容都应该正常工作。您可以查看此链接,以“正常”方式执行SignalR:signalR CORS - IE client gets 403 'Forbidden: JSONP is disabled'

移动服务与众不同。我们为SignalR做了很多事情。看起来您正在调用Mobile Services来初始化SignalR,然后尝试自己初始化它。我不确定那里会发生什么,但有些东西可能无法正常连线。

同样,如果您使用的是移动服务,那么我建议您升级到Azure App Service移动应用程序。有SDK版本更改,但Mobile Apps不对SignalR做任何事情,所以事情将以正常方式为您服务。