如何使用 SignalR 在 Azure 移动服务 .Net 后端启用 JsonP
How to enable JsonP on Azure mobile service .Net backend with SignalR
我正在尝试从 Apache Cordova 应用程序访问托管在 Azure 移动服务中的 SignalR,但在启动集线器连接时出现错误 403 Forbidden: JSONP 在与 Web 套接字协议的协商请求中被禁用。
我尝试如下添加 EnableJsonP,但它仍然出现同样的问题,是否有任何其他方法可以为 azure 托管移动服务启用 jsonp。
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;
}
}
使用 Azure Mobile 有两种不同的方式 - 应用服务和移动服务。如果您在经典门户中进行配置 (https://manage.windowsazure.com),那么您正在使用移动服务。如果不是,则您在应用服务中。根据这个问题,我认为您正在使用移动服务,所以如果您仍在开发中,我建议升级 - 请改用应用服务!
App Service 不会对 SignalR 做任何特殊的事情,所以所有 "normal" SignalR 的东西应该都能正常工作。您可以查看此 link 以 "normal" 方式执行 SignalR:signalR CORS - IE client gets 403 'Forbidden: JSONP is disabled'
移动服务不同。我们确实为 SignalR 连接了一堆东西。看起来您正在调用移动服务来初始化 SignalR,然后尝试自己初始化它。我不确定那里会发生什么,但可能无法正确连接。
同样,如果您使用的是移动服务,那么我建议升级到 Azure 应用服务移动应用。有 SDK 版本更改,但移动应用程序不会对 SignalR 执行任何操作,因此一切正常。
我正在尝试从 Apache Cordova 应用程序访问托管在 Azure 移动服务中的 SignalR,但在启动集线器连接时出现错误 403 Forbidden: JSONP 在与 Web 套接字协议的协商请求中被禁用。 我尝试如下添加 EnableJsonP,但它仍然出现同样的问题,是否有任何其他方法可以为 azure 托管移动服务启用 jsonp。
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;
}
}
使用 Azure Mobile 有两种不同的方式 - 应用服务和移动服务。如果您在经典门户中进行配置 (https://manage.windowsazure.com),那么您正在使用移动服务。如果不是,则您在应用服务中。根据这个问题,我认为您正在使用移动服务,所以如果您仍在开发中,我建议升级 - 请改用应用服务!
App Service 不会对 SignalR 做任何特殊的事情,所以所有 "normal" SignalR 的东西应该都能正常工作。您可以查看此 link 以 "normal" 方式执行 SignalR:signalR CORS - IE client gets 403 'Forbidden: JSONP is disabled'
移动服务不同。我们确实为 SignalR 连接了一堆东西。看起来您正在调用移动服务来初始化 SignalR,然后尝试自己初始化它。我不确定那里会发生什么,但可能无法正确连接。
同样,如果您使用的是移动服务,那么我建议升级到 Azure 应用服务移动应用。有 SDK 版本更改,但移动应用程序不会对 SignalR 执行任何操作,因此一切正常。