SignalR Versions Save

Incredibly simple real-time web for .NET

2.0.0

10 years ago

Overview

Ability to send to a User

This feature allows users to specify what the userId is based on an IRequest via a new interface IUserIdProvider:

public interface IUserIdProvider
{
    string GetUserId(IRequest request);
}

By default there will be an implementation that uses the user's IPrincipal.Identity.Name as the user name.

In hubs, you'll be able to send messages to these users via a new API:

public class MyHub : Hub
{
    public void Send(string userId, string message)
    {
        Clients.User(userId).send(message);
    }
}

Better Error handling support

Users can now throw HubException from any hub invocation. The constructor of the HubException can take a string message and an object extra error data. SignalR will auto-serialize the exception and send it to the client where it will be used to reject/fail the hub method invocation.

The show detailed hub exceptions setting has no bearing on HubException being sent back to the client or not; it always is.

Server

public class MyHub : Hub
{
    public void Send(string message)
    {
        if(message.Contains("<script>"))
        {
            throw new HubException("This message will flow to the client", new { user = Context.User.Identity.Name, message = message });
        }

        Clients.All.send(message);
    }
}

JS Client


myHub.server.send("<script>")
            .fail(function (e) {
                if (e.source === 'HubException') {
                    console.log(e.message + ' : ' + e.data.user);
                }
            });

.NET Client

try
{
    await myHub.Invoke("Send", "<script>");
}
catch(HubException ex)
{
    Conosle.WriteLine(ex.Message);
}

Features

  • Add ability to send a message to a "user" (#2401)
  • Add HubException that always flows back to hub clients (#2376)
  • Allow easy filtering of exception in the Hub Pipeline Module (#1882)

Bugs Fixed

  • Add .NET servicing attribute to all assemblies (#2444)
  • typo in Abort connection log message (#2404)
  • Closing Firefox/Opera tab does not trigger OnDisconnected event (#2400)
  • Fix description and dependencies of nuget package SignalR.SelfHost (#2384)
  • Update README files for WebHost and SelfHost (#2383)
  • GlobalHost.Configuration.XX should display their default value on Intellisense (#2370)
  • Self-hosted SignalR client calls fail after start.done() for a short duration (#2358)
  • DebugTextWriter on Portable causes each character to be written on its own line (#2321)
  • 2.0.0-beta2 - takes 2 minutes for client to call server (#2306)
  • Version SignalR 2.0.0-beta2 Could not load type... error! (#2242)
  • Scaleout - ServiceBus: No tracing with incorrect connection string (#2211)
  • JS client immediately start->stop->start connection, the first deferred.done is also triggered (#2189)

2.0.0rc

10 years ago

Overview

Renamed OWIN methods

To be more compatible with OWIN standards we've renamed MapHubs and MapConnection to MapSignalR. This gives you a single entry point for configuring SignalR into the OWIN pipeline. We've also introduced RunSignalR for more advanced scenarios (there's an example in the cross domain document).

Before

using Microsoft.Owin;
using Owin;

namespace MyWebApplication
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Map all hubs to "/signalr"
            app.MapHubs();

            // Map the Echo PersistentConnection to "/echo"
            app.MapConnection<EchoConnection>("/echo");
        }
    }
}

After

using Microsoft.Owin;
using Owin;

namespace MyWebApplication
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Map all hubs to "/signalr"
            app.MapSignalR();

            // Map the Echo PersistentConnection to "/echo"
            app.MapSignalR<EchoConnection>("/echo");
        }
    }
}

Cross domain support

In SignalR 1.x cross domain requests were controlled by a single EnableCrossDomain flag. This flag controlled both JSONP and CORS requests. For greater fleixibility, we've removed all CORS support from SignalR and have made new OWIN middleware available to support these scenarios. To add support for CORS requests, install Microsoft.Owin.Cors and call UseCors before your SignalR middleware:

Before

using Microsoft.AspNet.SignalR;
using Microsoft.Owin.Cors;
using Owin;

namespace MyWebApplication
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapHubs(new HubConfiguration { EnableCrossDomain = true });
        }
    }
}

After

using Microsoft.AspNet.SignalR;
using Microsoft.Owin.Cors;
using Owin;

namespace MyWebApplication
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Branch the pipeline here for requests that start with "/signalr"
            app.Map("/signalr", map =>
            {
                // Setup the cors middleware to run before SignalR.
                // By default this will allow all origins. You can 
                // configure the set of origins and/or http verbs by
                // providing a cors options with a different policy.
                map.UseCors(CorsOptions.AllowAll);

                var hubConfiguration = new HubConfiguration 
                {
                    // You can enable JSONP by uncommenting line below.
                    // JSONP requests are insecure but some older browsers (and some
                    // versions of IE) require JSONP to work cross domain
                    // EnableJSONP = true
                };

                // Run the SignalR pipeline. We're not using MapSignalR
                // since this branch is already runs under the "/signalr"
                // path.
                map.RunSignalR(hubConfiguration);
            });
        }
    }
}

The new CORS middleware also allows you to specify a CorsPolicy which lets you lock down which origins you want to allow requests from.

JSONP is now a separate flag on ConnectionConfiguration and HubConfiguration and can be enabled if there is a need to support older browsers (and some versions of IE).

Sending a single message to multiple clients and groups

You can now send to multiple groups or multiple connections easily and efficiently.

Persistent Connection

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;

namespace MyApplication
{
    public class ChatConnection : PersistentConnection
    {
        protected override Task OnReceived(IRequest request, string connectionId, string data)
        {
            IList<string> connectionIds = DB.GetConnections(request.User.Identity.Name);

            return Connection.Send(connectionIds, data);
        }
    }
}

Hubs

using System;
using System.Collections.Generic;
using Microsoft.AspNet.SignalR;

namespace MyApplication
{
    public class Chat : Hub
    {
        public void Send(string message)
        {
            IList<string> connectionIds = DB.GetConnections(Context.User.Identity.Name);
            Clients.Clients(connectionIds).send(message);
        }
    }
}

Easier unit testing of Hubs

We've introduced an interface IHubCallerConnectionContext on Hubs that makes it easier to mock client side invocations. Here's an example using xunit and Moq.

[Fact]
public void HubsAreMockableViaDynamic()
{
    bool sendCalled = false;
    var hub = new MyHub();
    var mockClients = new Mock<IHubCallerConnectionContext>();

    hub.Clients = mockClients.Object;

    dynamic all = new ExpandoObject();
    all.send = new Action<string>(message =>
    {
        sendCalled = true;
    });

    mockClients.Setup(m => m.All).Returns((ExpandoObject)all);
    hub.Send("foo");

    Assert.True(sendCalled);
}

[Fact]
public void HubsAreMockableViaType()
{
    var hub = new MyHub();
    var mockClients = new Mock<IHubCallerConnectionContext>();
    var all = new Mock<IClientContract>();

    hub.Clients = mockClients.Object;
    all.Setup(m => m.send(It.IsAny<string>())).Verifiable();
    mockClients.Setup(m => m.All).Returns(all.Object);
    hub.Send("foo");

    all.VerifyAll();
}

public interface IClientContract
{
    void send(string message);
}

JavaScript error handling

All JavaScript error handling callbacks flow JavaScript error objects instead of raw strings. This allows us to flow richer information to your error handlers. You can get the inner exception from the source property of the error.

connection.start().fail(function(e) {
    console.log('The error is: ' + e.message);
});

Features

  • Add EnableJSONP flag to ConnectionConfiguration (#2328)
  • Using the host-provided "host.TraceOutput" writer on OWIN hosts (#2260)
  • Create advanced CORS middleware for specific CORS policy support (#2072)
  • Make it easier (or possible) to mock Clients.Group, Clients.OthersInGroup, etc (#1899)
  • Create method Client(string array) in IHubConnectionContext / HubContext (#1789)
  • Unable to send complex datatype from JS using PersistentConnection (#327)

Bugs Fixed

  • JS client fails in IE8 due to use of "undefined" keyword (#2377)
  • Improve logging on the JS client (#2366)
  • Have PingInterval stop the connection on 401's and 403's. (#2360)
  • Latest firefox not firing clean disconnect on browser refresh (#2357)
  • JS client longPolling not raise reconnected event for reconnect when server process stop and re-start (#2353)
  • JS client should pass an error object to connection.error handlers (#2345)
  • Aborting the connection while negotiating should reject the deferred (#2340)
  • Consider removing the parameter excludeConnectionIds for API that connection send to specified connecitonId (#2330)
  • Reconnect fires on .NET client after connection timeout (#2323)
  • JS Client OnError should be invoked with non-empty error messages (#2317)
  • SignalR intermittently stalls (MessageBroker workers all busy) (#2302)
  • Make our self host depend on owin self host package (#2291)
  • longPolling does not trigger start().fail when authorization fails (#2288)
  • Hub invocation callbacks are not cleaned up in C# client if no response is received causing a memory leak (#2273)
  • Hub invocation callbacks are not cleaned up in JS client if no response is received causing a memory leak (#2271)
  • JS client foreverFrame run into script error : Unable to get property 'contentWindow' of undefined or null reference (#2249)
  • WebSocket message limit should only apply to server logic (#2247)
  • Expose underlying owin headers, form and query string via new abstractions on IRequest (#2243)
  • JS Client - Window unload is deprecated as of jQuery 1.8 (#2240)
  • Have long and short running HttpClients use different connection groups (#2227)
  • Make HttpClientException.ToString more useful (#2224)
  • C# Client - WebSockets transport shifts into Connected state when exception thrown in hubs OnConnected (#2219)
  • When the app domain restarts, and the client reconnects with the previous group token in querystring, sometimes the group is not added on the server (#2207)
  • Use unique connection groups in .NET 4 client for long running and short running requests (#2204)
  • Relax conditions under which errors are thrown for invoking callback methods on the client (#2203)
  • In JS client when transport falls back, OnConnected can be called twice for same connection id (#2195)
  • .NET client Stop() takes 30 secs to complete (#2191)
  • JavaScript Client does not cause OnReconnected event to fire when using longPolling transport (#2188)
  • When scaleout backplane is not up, .Net client webSockets connection becomes connected after start (#2186)
  • Remove portable .NET http client and use in box version for .NET 4.5 (#2177)
  • Don't capture the execution context when registering cancellation token callbacks. (#2167)
  • Failing to connect when IIS enables both Anonymous and Basic (#2145)
  • Update Header in the .Net client even if connection is connected (#2142)
  • Performance problem using long polling with many clients (#2125)
  • Hub calls should fail if request's response is 3xx redirect (#2106)
  • The user identity cannot change during an active SignalR connection (#1998)
  • Reconnect does not work with Chrome/serverSentEvents transport when server disappears/reappears (#1946)
  • Possible confusion in SignalR.Client.Transports.AutoTransport when overriding the default transport order (#1884)
  • JS client with $.ajaxSetup can cause SignalR ajaxSend work unexpectedly (#1773)
  • Set the crossdomain flag for cors ajax request (#1735)
  • Reconnect can be raised after Disconnect for websocket connections (#1231)
  • Improve logging to show when no hub subscriptions are made. (#1151)
  • With several connections connected, after server restart and clients reconnected, sometimes the connections can't receive message however still can send message (#1124)

1.0rc2

10 years ago

Notable Commits

  • Removed checks for the GAC and dynamic assemblies. (2cb4491fc6)
  • Modified KeepAlive to be an integer instead of a TimeSpan. (a27f41f327)
  • Added total topics performance counter. (ece78b804c)
  • Changing default message size to 1000. (88f7134b8e)
  • Exposed GetHttpContext extension method from SystemWeb assembly. (6ea4b20e87)
  • Remove ServerVariables from IRequest. (7f4969c6a8)
  • Fix some issues with SignalR's owin request impl on mono. (b5c05bc6bf)

Features

  • Added support for windows phone 8.
  • Add websocket support for the .NET client. (#985)
  • Ability to prevent auto generated Javascript proxies. (#978)
  • Remove the Mode parameter from AuthorizeAttribute. (#956)

Breaking Changes

  • Moved several types into different namespaces. (524e606e7f)
  • MapHubs and MapConnection no longer take route parameters. They are just prefixes. (b7b1371a2a)

Bugs Fixed

  • Validate that connection IDs are in correct format in PersistentConnection on all requests. (#1298)
  • Remove "Async" from all member names. (#1276)
  • WebSocket transport: Unclean disconnects are being treated as clean disconnects. (#1254)
  • JS client longPolling can't reconnect when server process restarts except after the first rebuild. (#1246)
  • Registry exception. (#1244)
  • JS Client: LongPolling OnConnected message doesn't make it to client. (#1241)
  • In JS client, Group names are not encoded in the querystring when a transport reconnects. (#1233)
  • SL5 client is not working. it fails to load json.net. (#1223)
  • Interval between keep alive missed and notifying transport seems to small. (#1211)
  • "+" sign in a string gets transformed to a space. (#1194)
  • LP: Clients cannot receive messages on client if message is sent right after start. (#1185)
  • Fix issues with growing number of dead connections consuming too much memory. (#1177)
  • JS Client: Base events (reconnecting, connected, received etc.) are not unique to connection objects. (#1173)
  • PerformanceCounterCategory.Exists hangs. (#1158)
  • JS client function isCrossDomain returns true for same website /host url. (#1156)
  • Waiting on multiple commands in OnConnectedAsync causes a TaskCanceledException in ForeverTransports (SSE, FF, WS). (#1155)
  • JS client can't receive messages after reconnected for network disconnect and re-connected. (#1144)
  • .NET client fails auto-negotiation fallback. (#1125)
  • Deadlock in .NET client websocket stop logic. (#1120)
  • Remove MozWebSocket check in javascript websocket transport. (#1119)
  • OutOfMemoryException after sending a lot of huge messages. (#1114)
  • Don't create topics when publishing. (#1071)
  • Unseal AuthorizeAttribute. (#1050)
  • Topic objects remain in Active state and never clean up after all clients disconnected. (#1001)
  • Remove the Mode parameter from AuthorizeAttribute. (#956)
  • on IE10/9 foreverFrame transport connection can't receive message after network disconnect time and network re-connect. (#820)

1.0.0

10 years ago

Breaking Changes

  • Disable CORS by default (#1306)
var config = new HubConfiguration 
{ 
    EnableCrossDomain = true
} 
RouteTable.Routes.MapHubs(config);
  • Don't return error text by default for hub errors (#923)
    • This means that exception messages are turned off by default
var config = new HubConfiguration 
{ 
    EnableDetailedErrors = true
} 

RouteTable.Routes.MapHubs(config); 
  • EnableAutoRejoiningGroups has been removed from HubPipeline. This feature is turned on by default. The groups payload is signed to the client cannot spoof groups anymore.

Bugs Fixed

  • Send nosniff header for all SignalR responses (#1450)
  • Hub state and args are placed into a dictionary directly from user input from the URL (#1449)
    • JSON.NET 20 is the limit of recursion
    • 4096 KB is maxium size JSON payload
  • HubDispatcher allows duplicate hub names in connectionData (#1448)
    • If you have duplicate HubNames in your HubConnection, you will get an exception Duplicate hub names found
  • ForeverFrame transport should validate frameId passed through the URL (#1446)
  • Route matching for the Owin hub dispatcher handler is too agressive (#1445)
  • JSONP callback method should be validated as valid JS identifier (#1444)
  • Hub method discovery includes methods it shouldn't (#1443)
  • Add CSRF protection for SignalR requests (#1413)
  • AV at Microsoft.Owin.Host.SystemWeb.OwinCallContext.StartOnce (#1402)
  • WebSocket leak HttpContext even though DefaultWebSocketHandler is closed (#1387)
  • Bug with same origin check behind reverse proxies/load balancers etc. (#1363)
  • Add summary in public AuthorizeAttribute class (#1353)
  • Infer hubs path from the url (#1346)
  • Sign the groups (#1328)
  • End the request, not connection as soon as cancellation token trips. (#1327)
  • Prefix for group from PersistentConnectionContext is not right (#1326)
  • Throw in ASP.NET 4 if the purpose isn't connection id and groups. (#1325)
  • Prevent connections from subscribing to a group that's actually a valid connection ID or Hub name (#1320)
  • Ensure that we don't allow clients to provide duplicate signals in cursors (#1312)
  • Add Authorize method to PersistentConnection. (#1308)
    • Added Authorize and AuthorizeRequest method to PersistentConnection.
    • This is the place in the pipeline to authorize requests. If a request fails authorization then a 403 is returned.
  • Consider signing the connection id (#1305)
  • Change LongPollingTransport.Send to be non-virtual (#1292)
  • Change TopicMessageBus use of array to IList<T> (#1291)
  • Change Subscription.PerformWork to take a IList instead of List (#1290)
  • Change Linktionary to IndexedDictionary (#1289)
  • Investigate changing all uses of IEnumerable<T> in the API to IList<T> (#1288)
  • Change IHubIncomingInvokerContext.Args to IList (#1287)
  • Change DefaultJavaScriptProxyGenerator.GetDescriptorName to non-vritual (#1286)
  • Change Subscription.Data to Received in .NET client (#1285)
  • Change .NET Client uses of arrays to IList (#1284)
  • Change IConnection.Groups to IList<T> (#1282)
  • Change ConnectionMessage.ExcludedSignals to IList (#1278)
  • Add overloads for methods with params array on hot paths (#1277)
  • Client webSockts and SSE transports, after reconnected, Disconnect Command from server causes the reconnected connection to disconnect (#1273)
  • Loading Resources in Windows Ph8/Windows Store applications (#1232)
  • Long Polling leaking requests sometimes (#1164)
  • Signalr.exe to generate hub proxy only works for webapplication projects
  • jquery.signalr.1.0.0.js file has the version specified as 1.0.0.rc1. The version is actually 1.0.0
  • ScaleOut with Redis/Service Bus
    • Scale Out with SignalR using ServiceBus or Redis
    • Scaleout using Azure Service Bus or Redis is still under development. If you are using 1.0.0-RC2 versions of the ScaleOut packages then please upgrade to 1.0.0-RC3 if you want to use SignalR 1.0.0

Known Issues

  • JS client with jQuery 1.9.1 / 1.9.0 raises connection error for all sends on persistent connection API (#1437

1.0.1

10 years ago

Bugs Fixed

  • Connection Id not read properly when additional query string parameters are added (#1556)
  • WebSocket leaks if Close throws an exception (#1554)
  • CancellationTokenSource has been disposed (#1549)
  • Regression: State doesn't work when accessed as dictionary without casting (#1545)
  • Don't catch exceptions thrown from user-defined OnReceived handlers on the JS client (#1530)
  • Calling connection.stop() with the serverSentEvent transport on Opera raises a TypeError. (#1519)
  • Doc summary for BuildRejoiningGroups is wrong (#1505)
  • When converting JRaw to concrete type use default serialization settings that container a max depth (#1484)
  • AV in ForeverTransport<ProcessMessages> under stress (#1479)
  • JS client version property is incorrect (#1476)
  • Throw the "Not a websocket request" exception synchronously (#1440)
  • JS client with jQuery 1.9.0 raises connection error for all sends on persistent connection API (#1437)
  • Groups.Add.Wait fails, http.sys logs shows "Connection_Dropped" with no apparent reason. (#1435)
  • .NET client OnError is raised when calling connection.Stop and using WebSocket transport (#1397)
  • Fuzz test the cursor parsing logic. (#1307)
  • Improve the error message "Incompatible protocol version". (#1176)
  • PerformanceCounterCategory.Exists hangs (#1158)
  • SignalR .NET Client HubConnection looping between Reconnecting and Connected (#1121)

1.1.0beta

10 years ago

General Changes

  • Performance improvements in throughput and memory usage.
  • New scaleout provider infrastructure and providers for Redis, SqlServer and Azure Service Bus.

Known Issues

  • When the backplane goes offline (redis, sql, service bus) you may miss messages.

Features

  • Add overload to MapHubs and MapConnection to allow adding OWIN middleware (#1800)
  • Removed Connection.Disconnect() (#1798)
  • Force <= IE8 to use LongPolling (#1764)
  • Support common scale-out message bus semantics in an abstract base class (#1712)
  • Support SQL Server scale-out message bus (#1711)
  • Make SQL message bus light up with query notifications only if service broker is available (#1662)
  • Allow specifiying the JsonSerializer in the .NET Client (#1373)
  • Allow specifying headers in the .NET client (#1362)
  • Allow specifying client certificates in the .NET Client (#1303)
  • Support client side keep alive for the .NET client (#741)
  • Add tracing to the .NET client (#135)
  • Add trace level to the .NET client (#1746)

Bugs Fixed

  • ConnectDisconnect test failed due to a leak on w3wp.exe (#1801)
  • Update error messages based on customer feedback (#1734)
  • Hub script isn't minified (#1710)
  • Specifying the hubs url for a connection url should fail (#1707)
  • JS client webSockets and SSE transports only try request one time to connect during reconnect (#1684)
  • PerformanceCounter.RemoveInstance throws on mono (#1678)
  • in HubContext Clients.Client(null).foo() doesn't throw (#1660)
  • .NET client: Calling Stop before connecting fails (#1650)
  • [WebSockets] AbortStopDisconnect scenario failing: System.InvalidOperationException: Incorrect message type (#1607)
  • .NET client: OnError can be raised when stopping SSE connection (#1600)
  • Get rid of all synchronous reads/writes on the client (#1536)
  • Group tokens are not verified against the current connection ID on reconnect (#1506)
  • Unhandled exceptions within service bus backplane (#1504)
  • Optimize hub method invocation (#1486)
  • Extending javascript array potentially breaks other code (#1392)
  • IE9 object serialization on persistant connection received (#1388)
  • Hub Clients.Client(null).foo() should throw same as PersistentConnection Connection.Send(null, message) (#1265)
  • Multiple connections don't work on the same page in some cases (#1243)
  • Client infinitely receive same messages from server when publish message with same Id (#948)
  • jQuery $.ajaxSetup issue (#947)
  • SqlServer - Use real schema instead of deprecated "dbo" (#943)
  • SignalR Redis doesn't reconnect to Redis server after stop and re-start Redis server (#916)
  • Scaleout Bus mapping grows infinitely (#723)
  • Several browsers show infinite loading status (IE8) (#215)

1.1.0

10 years ago

Features

  • Add tracing to Service Bus message bus (#1912)
  • Add more scaleout performance counters (#1833)
  • Ensure fairness in scale-out message delivery using arrival time stamp for sorting (#1807)
  • Support generating an install script (#1793)

Bugs Fixed

  • [LP] - ConcurrentCalls causing leak on server side (#1993)
  • 'r' is undefined (#1975)
  • Duplicates messages received when using 2 machines (#1973)
  • Memory leak in connection tracking when using scaleout (#1953)
  • Missing messages when sending to groups (#1948)
  • ServiceBusMessageBus should delete subscriptions when the application shuts down ungracefully (#1939)
  • Only unwrap one level of exceptions when returning hub errors to client (#1919)
  • in SqlScaleoutConfiguration it should throw when TableCount < 1 (#1888)
  • Refactor SQL message bus to use events instead of delegate passing (#1879)
  • LP/SSE hang when using a reasonable value for ServicePoint DefaultConnectionLimit (#1874)
  • Unobserved ODE after manually stopping a connection on the .NET client (#1848)
  • Overwhelming the queue can cause issues sending to other clients (#1847)
  • The WebSocket instance cannot be used for communication because it has been transitioned into an invalid state. (#1846)
  • Validate ServiceBusScaleoutConfiguration members (#1806)
  • JS client webSockets /serverSendEvents /foreverFrame don't append /reconnect but append /poll in url when reconnect, however functional still work (#1794)
  • Update RedisMessageBus to use latest version of Booksleeve (#1788)
  • LongPollingTransport threw ObjectDisposedException in AbortResetEvent.Set() (#1691)
  • Redis message bus can result in missed messages due to messages received out of order from backplane (#1676)

1.1.1

10 years ago

Bugs Fixed

  • SignalR Groups.Remove doesn't work (#2040)
  • Changing the number of streams/topics/tables crashes the process when using scaleout (#2024)

2.0.0beta1

10 years ago

Features

  • Preliminary work to allow server to support multiple protocol versions (#2017)
  • Use HttpClient for .NET client HTTP stack (#1908)
  • Tighter OWIN integration (#1906)
  • Make Client.Connection Disposable (#1844)
  • support /signalr/js for returning javascript proxy (#1822)
  • Take a .NET 4.5 dependency in SignalR core (server side) (#1723)
  • Add supported client libraries for MonoTouch & MonoDroid (#1669)
  • Allow for overriding JS json deserializing function (#1564)

Bugs Fixed

  • Ensure data protection and build manager dependencies come from IAppBuilder (#2013)
  • Check for valid json serializer fails if there is no window.json (#2003)
  • Fix UserAgent for the .NET client (#1994)
  • Remove the IJsonSerializer abstraction (#1821)
  • Persistent Connection fails with IIS8 on Android Stock Browser (#1653)
  • OwinExtensions depends on host.AppName environment which may be null and will result in an exception. (#1616)

1.1.2

10 years ago

Bugs Fixed

  • Scaleout Message Bus Memory Leak (#2070)