diff --git a/NuGet/WampSharp.AspNetCore.WebSockets.Server.nuspec b/NuGet/WampSharp.AspNetCore.WebSockets.Server.nuspec
index 34bd12ae4..f6db7795f 100644
--- a/NuGet/WampSharp.AspNetCore.WebSockets.Server.nuspec
+++ b/NuGet/WampSharp.AspNetCore.WebSockets.Server.nuspec
@@ -20,5 +20,7 @@
+
+
\ No newline at end of file
diff --git a/NuGet/WampSharp.Default.Client.nuspec b/NuGet/WampSharp.Default.Client.nuspec
index c97fadeb6..4629f742b 100644
--- a/NuGet/WampSharp.Default.Client.nuspec
+++ b/NuGet/WampSharp.Default.Client.nuspec
@@ -28,6 +28,11 @@
+
+
+
+
+
WampSharp.Default.Client
WampSharp default client binding
@@ -47,5 +52,7 @@
+
+
\ No newline at end of file
diff --git a/NuGet/WampSharp.Default.nuspec b/NuGet/WampSharp.Default.nuspec
index d6bfee69a..612cc2ac6 100644
--- a/NuGet/WampSharp.Default.nuspec
+++ b/NuGet/WampSharp.Default.nuspec
@@ -19,6 +19,9 @@
+
+
+
WampSharp.Default
WampSharp default binding
diff --git a/NuGet/WampSharp.NewtonsoftJson.nuspec b/NuGet/WampSharp.NewtonsoftJson.nuspec
index 953f35d50..3fefd009e 100644
--- a/NuGet/WampSharp.NewtonsoftJson.nuspec
+++ b/NuGet/WampSharp.NewtonsoftJson.nuspec
@@ -21,6 +21,10 @@
+
+
+
+
@@ -42,5 +46,7 @@
+
+
diff --git a/NuGet/WampSharp.NewtonsoftMsgpack.nuspec b/NuGet/WampSharp.NewtonsoftMsgpack.nuspec
index 0037390ca..d6b4c9be1 100644
--- a/NuGet/WampSharp.NewtonsoftMsgpack.nuspec
+++ b/NuGet/WampSharp.NewtonsoftMsgpack.nuspec
@@ -20,6 +20,11 @@
+
+
+
+
+
WampSharp.NewtonsoftMsgpack
WampSharp Newtonsoft.Msgpack binding
@@ -35,5 +40,7 @@
+
+
diff --git a/NuGet/WampSharp.RawSocket.nuspec b/NuGet/WampSharp.RawSocket.nuspec
index f6f503a72..a0d8a5ed8 100644
--- a/NuGet/WampSharp.RawSocket.nuspec
+++ b/NuGet/WampSharp.RawSocket.nuspec
@@ -14,6 +14,10 @@
+
+
+
+
WampSharp.RawSocket
WampSharp RawSocket support
@@ -27,5 +31,7 @@
+
+
\ No newline at end of file
diff --git a/NuGet/WampSharp.Vtortola.nuspec b/NuGet/WampSharp.Vtortola.nuspec
index bbae25b58..dc6b3d018 100644
--- a/NuGet/WampSharp.Vtortola.nuspec
+++ b/NuGet/WampSharp.Vtortola.nuspec
@@ -5,8 +5,14 @@
CodeSharp
-
-
+
+
+
+
+
+
+
+
WampSharp.Vtortola
WampSharp Vtortola support
@@ -18,5 +24,7 @@
+
+
diff --git a/NuGet/WampSharp.WebSocket4Net.nuspec b/NuGet/WampSharp.WebSocket4Net.nuspec
index 3ef125456..96c373a8c 100644
--- a/NuGet/WampSharp.WebSocket4Net.nuspec
+++ b/NuGet/WampSharp.WebSocket4Net.nuspec
@@ -17,6 +17,10 @@
+
+
+
+
WampSharp.WebSocket4Net
WampSharp WebSocket4Net connection
@@ -32,5 +36,7 @@
+
+
diff --git a/NuGet/WampSharp.WebSockets.nuspec b/NuGet/WampSharp.WebSockets.nuspec
index 696df374a..4a8985eee 100644
--- a/NuGet/WampSharp.WebSockets.nuspec
+++ b/NuGet/WampSharp.WebSockets.nuspec
@@ -10,11 +10,14 @@
WampSharp System.Net.WebSockets.WebSocket support
websockets,wampws,rpc,pubsub,wampv1,wampv2
+
+
+
-
+
@@ -24,5 +27,7 @@
+
+
\ No newline at end of file
diff --git a/NuGet/WampSharp.nuspec b/NuGet/WampSharp.nuspec
index 0bdf9bc18..7fc312ec2 100644
--- a/NuGet/WampSharp.nuspec
+++ b/NuGet/WampSharp.nuspec
@@ -6,7 +6,7 @@
-
+
@@ -19,35 +19,35 @@
-
+
-
-
-
-
-
-
-
-
+
-
-
+
+
+
+
+
+
+
+
+
-
+
-
+
@@ -71,6 +71,8 @@
+
+
diff --git a/src/net45/Default/WampSharp.WebSocket4Net/WebSocket4Net/WebSocket4NetConnection.cs b/src/net45/Default/WampSharp.WebSocket4Net/WebSocket4Net/WebSocket4NetConnection.cs
index 8e31168ba..92fcba1c3 100644
--- a/src/net45/Default/WampSharp.WebSocket4Net/WebSocket4Net/WebSocket4NetConnection.cs
+++ b/src/net45/Default/WampSharp.WebSocket4Net/WebSocket4Net/WebSocket4NetConnection.cs
@@ -2,6 +2,7 @@
using SuperSocket.ClientEngine;
using WampSharp.Core.Listener;
using WampSharp.Core.Message;
+using WampSharp.Logging;
using WampSharp.V2.Binding;
using WebSocket4Net;
@@ -14,7 +15,9 @@ public abstract class WebSocket4NetConnection : IControlledWampConnect
private readonly IWampBinding mBinding;
private readonly WebSocket mWebSocket;
-
+
+ private readonly ILog mLogger;
+
#endregion
public WebSocket4NetConnection(WebSocket webSocket,
@@ -22,6 +25,7 @@ public WebSocket4NetConnection(WebSocket webSocket,
{
mBinding = binding;
mWebSocket = webSocket;
+ mLogger = LogProvider.GetLogger(this.GetType());
mWebSocket.Opened += WebSocketOnOpened;
mWebSocket.Closed += WebSocketOnClosed;
mWebSocket.Error += WebSocketOnError;
@@ -73,6 +77,7 @@ private void WebSocketOnClosed(object sender, EventArgs eventArgs)
private void WebSocketOnError(object sender, ErrorEventArgs e)
{
+ mLogger.Error("A connection error occured", e.Exception);
RaiseConnectionError(e.Exception);
}
diff --git a/src/net45/Extensions/WampSharp.Vtortola/VtortolaWampBinaryConnection.cs b/src/net45/Extensions/WampSharp.Vtortola/VtortolaWampBinaryConnection.cs
index 01e1d8072..3ee9b6d16 100644
--- a/src/net45/Extensions/WampSharp.Vtortola/VtortolaWampBinaryConnection.cs
+++ b/src/net45/Extensions/WampSharp.Vtortola/VtortolaWampBinaryConnection.cs
@@ -1,4 +1,5 @@
using System.IO;
+using System.Threading;
using System.Threading.Tasks;
using vtortola.WebSockets;
using WampSharp.Core.Message;
@@ -12,9 +13,10 @@ internal class VtortolaWampBinaryConnection : VtortolaWampConnection mBinding;
public VtortolaWampBinaryConnection(WebSocket connection,
- IWampBinaryBinding binding,
- ICookieAuthenticatorFactory cookieAuthenticatorFactory) :
- base(connection, cookieAuthenticatorFactory)
+ CancellationToken cancellationToken,
+ IWampBinaryBinding binding,
+ ICookieAuthenticatorFactory cookieAuthenticatorFactory) :
+ base(connection, cancellationToken, cookieAuthenticatorFactory)
{
mBinding = binding;
}
diff --git a/src/net45/Extensions/WampSharp.Vtortola/VtortolaWampConnection.cs b/src/net45/Extensions/WampSharp.Vtortola/VtortolaWampConnection.cs
index 24676ea0c..75f6ea621 100644
--- a/src/net45/Extensions/WampSharp.Vtortola/VtortolaWampConnection.cs
+++ b/src/net45/Extensions/WampSharp.Vtortola/VtortolaWampConnection.cs
@@ -16,14 +16,17 @@ internal abstract class VtortolaWampConnection : AsyncWebSocketWampCon
IDetailedWampConnection
{
protected readonly WebSocket mWebsocket;
+ private readonly CancellationToken mCancellationToken;
private readonly VtortolaTransportDetails mTransportDetails;
protected VtortolaWampConnection(WebSocket websocket,
- ICookieAuthenticatorFactory cookieAuthenticatorFactory)
+ CancellationToken cancellationToken,
+ ICookieAuthenticatorFactory cookieAuthenticatorFactory)
: base(new CookieCollectionCookieProvider(websocket.HttpRequest.Cookies),
- cookieAuthenticatorFactory)
+ cookieAuthenticatorFactory)
{
mWebsocket = websocket;
+ mCancellationToken = cancellationToken;
mTransportDetails = new VtortolaTransportDetails(mWebsocket);
}
@@ -33,7 +36,7 @@ public async Task HandleWebSocketAsync()
{
RaiseConnectionOpen();
- while (mWebsocket.IsConnected)
+ while (IsConnected)
{
WebSocketMessageReadStream message =
await mWebsocket.ReadMessageAsync(CancellationToken.None)
@@ -63,7 +66,8 @@ protected override bool IsConnected
{
get
{
- return mWebsocket.IsConnected;
+ return !mCancellationToken.IsCancellationRequested &&
+ mWebsocket.IsConnected;
}
}
diff --git a/src/net45/Extensions/WampSharp.Vtortola/VtortolaWampTextConnection.cs b/src/net45/Extensions/WampSharp.Vtortola/VtortolaWampTextConnection.cs
index 17af0a072..084ef8584 100644
--- a/src/net45/Extensions/WampSharp.Vtortola/VtortolaWampTextConnection.cs
+++ b/src/net45/Extensions/WampSharp.Vtortola/VtortolaWampTextConnection.cs
@@ -1,4 +1,5 @@
using System.IO;
+using System.Threading;
using System.Threading.Tasks;
using vtortola.WebSockets;
using WampSharp.Core.Message;
@@ -12,9 +13,10 @@ internal class VtortolaWampTextConnection : VtortolaWampConnection mBinding;
public VtortolaWampTextConnection(WebSocket connection,
- IWampTextBinding binding,
- ICookieAuthenticatorFactory cookieAuthenticatorFactory) :
- base(connection, cookieAuthenticatorFactory)
+ CancellationToken cancellationToken,
+ IWampTextBinding binding,
+ ICookieAuthenticatorFactory cookieAuthenticatorFactory) :
+ base(connection, cancellationToken, cookieAuthenticatorFactory)
{
mBinding = binding;
}
diff --git a/src/net45/Extensions/WampSharp.Vtortola/VtortolaWebSocketHttpResponse.cs b/src/net45/Extensions/WampSharp.Vtortola/VtortolaWebSocketHttpResponse.cs
index 1620d39cc..ee6c5f25e 100644
--- a/src/net45/Extensions/WampSharp.Vtortola/VtortolaWebSocketHttpResponse.cs
+++ b/src/net45/Extensions/WampSharp.Vtortola/VtortolaWebSocketHttpResponse.cs
@@ -1,6 +1,9 @@
using System.Linq;
using System.Net;
using vtortola.WebSockets;
+#if NETCORE
+using HttpStatusCode = vtortola.WebSockets.HttpStatusCode;
+#endif
namespace WampSharp.Vtortola
{
diff --git a/src/net45/Extensions/WampSharp.Vtortola/VtortolaWebSocketTransport.cs b/src/net45/Extensions/WampSharp.Vtortola/VtortolaWebSocketTransport.cs
index 43acb10ae..4a04be4bd 100644
--- a/src/net45/Extensions/WampSharp.Vtortola/VtortolaWebSocketTransport.cs
+++ b/src/net45/Extensions/WampSharp.Vtortola/VtortolaWebSocketTransport.cs
@@ -3,10 +3,10 @@
using System.Security.Cryptography.X509Certificates;
using System.Threading;
using System.Threading.Tasks;
-using WampSharp.Logging;
using vtortola.WebSockets;
using vtortola.WebSockets.Deflate;
using vtortola.WebSockets.Rfc6455;
+using WampSharp.Logging;
using WampSharp.Core.Listener;
using WampSharp.V2.Authentication;
using WampSharp.V2.Binding;
@@ -17,13 +17,14 @@ namespace WampSharp.Vtortola
///
/// Represents a WebSocket transport implemented with Vtortola.
///
- public class VtortolaWebSocketTransport : WebSocketTransport
+ public class VtortolaWebSocketTransport : WebSocketTransport
{
private readonly IPEndPoint mEndpoint;
private WebSocketListener mListener;
private readonly bool mPerMessageDeflate;
private readonly X509Certificate2 mCertificate;
private readonly WebSocketListenerOptions mOptions;
+ private CancellationTokenSource mCancellationToken;
///
/// Creates a new instance of
@@ -71,6 +72,7 @@ protected VtortolaWebSocketTransport
public override void Dispose()
{
+ mCancellationToken.Cancel();
mListener.Stop();
mListener.Dispose();
}
@@ -82,42 +84,56 @@ public override void Open()
WebSocketListenerOptions options = mOptions ?? new WebSocketListenerOptions();
options.SubProtocols = protocols;
-
+
WebSocketListener listener = new WebSocketListener(mEndpoint, options);
+#if NETCORE
+ WebSocketFactoryRfc6455 factory = new WebSocketFactoryRfc6455();
+#else
WebSocketFactoryRfc6455 factory = new WebSocketFactoryRfc6455(listener);
+#endif
if (mPerMessageDeflate)
{
- factory.MessageExtensions.RegisterExtension(new WebSocketDeflateExtension());
+#if NETCORE
+ listener.MessageExtensions.RegisterExtension(new WebSocketDeflateExtension());
+#else
+ factory.MessageExtensions.RegisterExtension(new WebSocketDeflateExtension());
+#endif
}
listener.Standards.RegisterStandard(factory);
-
+
if (mCertificate != null)
{
listener.ConnectionExtensions.RegisterExtension(new WebSocketSecureConnectionExtension(mCertificate));
}
+ mCancellationToken = new CancellationTokenSource();
+
+#if NETCORE
+ listener.StartAsync(mCancellationToken.Token);
+#else
listener.Start();
+#endif
mListener = listener;
- Task.Run(new Func(ListenAsync));
+ Task.Run(new Func(() => ListenAsync(mCancellationToken.Token)));
}
- private async Task ListenAsync()
+ private async Task ListenAsync(CancellationToken cancellationToken)
{
- while (mListener.IsStarted)
+ while (!cancellationToken.IsCancellationRequested)
{
try
{
- WebSocket websocket = await mListener.AcceptWebSocketAsync(CancellationToken.None)
+ WebSocket websocket = await mListener.AcceptWebSocketAsync(cancellationToken)
.ConfigureAwait(false);
if (websocket != null)
{
- OnNewConnection(websocket);
+ OnNewConnection(new WebSocketData(websocket, cancellationToken));
}
}
catch (Exception ex)
@@ -127,27 +143,33 @@ private async Task ListenAsync()
}
}
- protected override string GetSubProtocol(WebSocket connection)
+ protected override string GetSubProtocol(WebSocketData connection)
{
- return connection.HttpResponse.WebSocketProtocol;
+ return connection.WebSocket.HttpResponse.WebSocketProtocol;
}
- protected override void OpenConnection(WebSocket original, IWampConnection connection)
+ protected override void OpenConnection(WebSocketData original, IWampConnection connection)
{
VtortolaWampConnection casted = connection as VtortolaWampConnection;
Task.Run(new Func(casted.HandleWebSocketAsync));
}
protected override IWampConnection CreateBinaryConnection
- (WebSocket connection, IWampBinaryBinding binding)
+ (WebSocketData connection, IWampBinaryBinding binding)
{
- return new VtortolaWampBinaryConnection(connection, binding, AuthenticatorFactory);
+ return new VtortolaWampBinaryConnection(connection.WebSocket,
+ connection.CancellationToken,
+ binding,
+ AuthenticatorFactory);
}
protected override IWampConnection CreateTextConnection
- (WebSocket connection, IWampTextBinding binding)
+ (WebSocketData connection, IWampTextBinding binding)
{
- return new VtortolaWampTextConnection(connection, binding, AuthenticatorFactory);
+ return new VtortolaWampTextConnection(connection.WebSocket,
+ connection.CancellationToken,
+ binding,
+ AuthenticatorFactory);
}
}
}
\ No newline at end of file
diff --git a/src/net45/Extensions/WampSharp.Vtortola/WampSharp.Vtortola.csproj b/src/net45/Extensions/WampSharp.Vtortola/WampSharp.Vtortola.csproj
index fa3904714..344192c69 100644
--- a/src/net45/Extensions/WampSharp.Vtortola/WampSharp.Vtortola.csproj
+++ b/src/net45/Extensions/WampSharp.Vtortola/WampSharp.Vtortola.csproj
@@ -81,6 +81,7 @@
+
diff --git a/src/net45/Extensions/WampSharp.Vtortola/WebSocketData.cs b/src/net45/Extensions/WampSharp.Vtortola/WebSocketData.cs
new file mode 100644
index 000000000..a7e3eb5b7
--- /dev/null
+++ b/src/net45/Extensions/WampSharp.Vtortola/WebSocketData.cs
@@ -0,0 +1,17 @@
+using System.Threading;
+using vtortola.WebSockets;
+
+namespace WampSharp.Vtortola
+{
+ public class WebSocketData
+ {
+ public WebSocket WebSocket { get; }
+ public CancellationToken CancellationToken { get; }
+
+ public WebSocketData(WebSocket webSocket, CancellationToken cancellationToken)
+ {
+ WebSocket = webSocket;
+ CancellationToken = cancellationToken;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/net45/WampSharp.WAMP1/WAMP1/V1/Api/Server/WampRequestContext.cs b/src/net45/WampSharp.WAMP1/WAMP1/V1/Api/Server/WampRequestContext.cs
index fbd3893c5..e4942cd89 100644
--- a/src/net45/WampSharp.WAMP1/WAMP1/V1/Api/Server/WampRequestContext.cs
+++ b/src/net45/WampSharp.WAMP1/WAMP1/V1/Api/Server/WampRequestContext.cs
@@ -1,5 +1,8 @@
using System;
+#if !NETSTANDARD2_0
using System.Runtime.Remoting.Messaging;
+#endif
+using System.Threading;
using WampSharp.V1.Core.Contracts;
using WampSharp.V1.Cra;
@@ -10,6 +13,7 @@ public class WampRequestContext
{
#region Static Members
+#if !NETSTANDARD2_0
public static WampRequestContext Current
{
get
@@ -21,6 +25,21 @@ internal set
CallContext.LogicalSetData(typeof (WampRequestContext).Name, value);
}
}
+#else
+ private static readonly AsyncLocal mCurrent = new AsyncLocal();
+
+ public static WampRequestContext Current
+ {
+ get
+ {
+ return mCurrent.Value;
+ }
+ internal set
+ {
+ mCurrent.Value = value;
+ }
+ }
+#endif
#endregion
diff --git a/src/net45/WampSharp/Core/Utilities/SerializableAttribute.cs b/src/net45/WampSharp/Core/Utilities/SerializableAttribute.cs
index 18c90775c..9be89639a 100644
--- a/src/net45/WampSharp/Core/Utilities/SerializableAttribute.cs
+++ b/src/net45/WampSharp/Core/Utilities/SerializableAttribute.cs
@@ -1,4 +1,4 @@
-#if PCL
+#if PCL && !NETSTANDARD2_0
namespace System
{
diff --git a/src/netstandard1.3/Extensions/WampSharp.RawSocket/WampSharp.RawSocket.csproj b/src/netstandard1.3/Extensions/WampSharp.RawSocket/WampSharp.RawSocket.csproj
index 429e325d3..580bc37aa 100644
--- a/src/netstandard1.3/Extensions/WampSharp.RawSocket/WampSharp.RawSocket.csproj
+++ b/src/netstandard1.3/Extensions/WampSharp.RawSocket/WampSharp.RawSocket.csproj
@@ -24,7 +24,6 @@
-
\ No newline at end of file
diff --git a/src/netstandard1.3/WampSharp/WampSharp.csproj b/src/netstandard1.3/WampSharp/WampSharp.csproj
index 35cff99dc..a3e66b222 100644
--- a/src/netstandard1.3/WampSharp/WampSharp.csproj
+++ b/src/netstandard1.3/WampSharp/WampSharp.csproj
@@ -29,18 +29,12 @@
-
-
-
-
-
-
-
+
-
-
+
-
+
+
\ No newline at end of file
diff --git a/src/netstandard2.0/Default/WampSharp.NewtonsoftJson/WampSharp.NewtonsoftJson.csproj b/src/netstandard2.0/Default/WampSharp.NewtonsoftJson/WampSharp.NewtonsoftJson.csproj
new file mode 100644
index 000000000..11cad1c3d
--- /dev/null
+++ b/src/netstandard2.0/Default/WampSharp.NewtonsoftJson/WampSharp.NewtonsoftJson.csproj
@@ -0,0 +1,29 @@
+
+
+
+ netstandard2.0
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+
+
+
+
+
+
+
+ NETCORE
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/netstandard2.0/Default/WampSharp.NewtonsoftMsgpack/WampSharp.NewtonsoftMsgpack.csproj b/src/netstandard2.0/Default/WampSharp.NewtonsoftMsgpack/WampSharp.NewtonsoftMsgpack.csproj
new file mode 100644
index 000000000..dcb99ca69
--- /dev/null
+++ b/src/netstandard2.0/Default/WampSharp.NewtonsoftMsgpack/WampSharp.NewtonsoftMsgpack.csproj
@@ -0,0 +1,29 @@
+
+
+
+ netstandard2.0
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+
+
+
+
+
+
+
+ NETCORE
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/netstandard2.0/Default/WampSharp.WebSocket4Net/WampSharp.WebSocket4Net.csproj b/src/netstandard2.0/Default/WampSharp.WebSocket4Net/WampSharp.WebSocket4Net.csproj
new file mode 100644
index 000000000..9b8b10871
--- /dev/null
+++ b/src/netstandard2.0/Default/WampSharp.WebSocket4Net/WampSharp.WebSocket4Net.csproj
@@ -0,0 +1,30 @@
+
+
+
+ netstandard2.0
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+
+
+
+
+
+
+
+ NETCORE
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/netstandard2.0/Extensions/WampSharp.AspNetCore.WebSockets.Server/WampSharp.AspNetCore.WebSockets.Server.csproj b/src/netstandard2.0/Extensions/WampSharp.AspNetCore.WebSockets.Server/WampSharp.AspNetCore.WebSockets.Server.csproj
new file mode 100644
index 000000000..081069a5e
--- /dev/null
+++ b/src/netstandard2.0/Extensions/WampSharp.AspNetCore.WebSockets.Server/WampSharp.AspNetCore.WebSockets.Server.csproj
@@ -0,0 +1,29 @@
+
+
+
+ netstandard2.0
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+
+
+
+
+
+
+
+ NETCORE
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/netstandard2.0/Extensions/WampSharp.RawSocket/WampSharp.RawSocket.csproj b/src/netstandard2.0/Extensions/WampSharp.RawSocket/WampSharp.RawSocket.csproj
new file mode 100644
index 000000000..ac731c990
--- /dev/null
+++ b/src/netstandard2.0/Extensions/WampSharp.RawSocket/WampSharp.RawSocket.csproj
@@ -0,0 +1,29 @@
+
+
+
+ netstandard2.0
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+
+
+
+
+
+
+
+ NETCORE
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/netstandard2.0/Extensions/WampSharp.Vtortola/WampSharp.Vtortola.csproj b/src/netstandard2.0/Extensions/WampSharp.Vtortola/WampSharp.Vtortola.csproj
new file mode 100644
index 000000000..83379620a
--- /dev/null
+++ b/src/netstandard2.0/Extensions/WampSharp.Vtortola/WampSharp.Vtortola.csproj
@@ -0,0 +1,29 @@
+
+
+
+ netstandard2.0
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+
+
+
+
+
+
+
+ NETCORE
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/netstandard2.0/Extensions/WampSharp.WebSockets/WampSharp.WebSockets.csproj b/src/netstandard2.0/Extensions/WampSharp.WebSockets/WampSharp.WebSockets.csproj
new file mode 100644
index 000000000..d026d0af8
--- /dev/null
+++ b/src/netstandard2.0/Extensions/WampSharp.WebSockets/WampSharp.WebSockets.csproj
@@ -0,0 +1,29 @@
+
+
+
+ netstandard2.0
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+
+
+
+
+
+
+
+ NETCORE
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/netstandard2.0/Tests/WampSharp.Tests.TestHelpers/WampSharp.Tests.TestHelpers.csproj b/src/netstandard2.0/Tests/WampSharp.Tests.TestHelpers/WampSharp.Tests.TestHelpers.csproj
new file mode 100644
index 000000000..b4ad6fb9e
--- /dev/null
+++ b/src/netstandard2.0/Tests/WampSharp.Tests.TestHelpers/WampSharp.Tests.TestHelpers.csproj
@@ -0,0 +1,29 @@
+
+
+
+ netstandard2.0
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+
+
+
+
+
+
+
+ NETCORE
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/netstandard2.0/Tests/WampSharp.Tests.Wampv2/WampSharp.Tests.Wampv2.csproj b/src/netstandard2.0/Tests/WampSharp.Tests.Wampv2/WampSharp.Tests.Wampv2.csproj
new file mode 100644
index 000000000..aea7bb086
--- /dev/null
+++ b/src/netstandard2.0/Tests/WampSharp.Tests.Wampv2/WampSharp.Tests.Wampv2.csproj
@@ -0,0 +1,26 @@
+
+
+ netcoreapp2.0
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ NETCORE VALUETUPLE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/netstandard2.0/WampSharp.Default.Client/WampSharp.Default.Client.csproj b/src/netstandard2.0/WampSharp.Default.Client/WampSharp.Default.Client.csproj
new file mode 100644
index 000000000..7d6289db9
--- /dev/null
+++ b/src/netstandard2.0/WampSharp.Default.Client/WampSharp.Default.Client.csproj
@@ -0,0 +1,28 @@
+
+
+
+ netstandard2.0
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+
+
+
+
+
+
+
+ $(DefineConstants);NETCORE;
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/netstandard2.0/WampSharp.WAMP1/WampSharp.WAMP1.csproj b/src/netstandard2.0/WampSharp.WAMP1/WampSharp.WAMP1.csproj
new file mode 100644
index 000000000..257ef88ed
--- /dev/null
+++ b/src/netstandard2.0/WampSharp.WAMP1/WampSharp.WAMP1.csproj
@@ -0,0 +1,33 @@
+
+
+
+ WampSharp.WAMP1
+ CodeSharp
+ netstandard2.0
+ WampSharp.WAMP1
+ WampSharp.WAMP1
+ websockets;wampws;rpc;pubsub;wampv2
+ https://github.com/Code-Sharp/WampSharp/
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+
+
+
+
+
+
+ $(DefineConstants);NET45;
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/netstandard2.0/WampSharp/WampSharp.csproj b/src/netstandard2.0/WampSharp/WampSharp.csproj
new file mode 100644
index 000000000..9b06a0b80
--- /dev/null
+++ b/src/netstandard2.0/WampSharp/WampSharp.csproj
@@ -0,0 +1,38 @@
+
+
+
+ WampSharp
+ CodeSharp
+ netstandard2.0
+ WampSharp
+ WampSharp
+ websockets;wampws;rpc;pubsub;wampv2
+ https://github.com/Code-Sharp/WampSharp/
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ true
+
+
+
+
+
+
+ $(DefineConstants);NET45;NETCORE;PCL;CASTLE;LIBLOG_PUBLIC;LIBLOG_PORTABLE;TPL;ASYNC_LOCAL;ASYNC;WAMPCRA
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/netstandard2.0/WampSharpNetStandard.sln b/src/netstandard2.0/WampSharpNetStandard.sln
new file mode 100644
index 000000000..0b836d77f
--- /dev/null
+++ b/src/netstandard2.0/WampSharpNetStandard.sln
@@ -0,0 +1,108 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26730.16
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WampSharp", "WampSharp\WampSharp.csproj", "{8EB8EF7A-FF96-4BA2-9662-C4882DBD1126}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{4CADCB5B-7607-4B2C-A1C4-0550568AAE5D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extensions", "Extensions", "{E3EAE72D-738A-4179-8A22-50D58A91AD04}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Default", "Default", "{72E8F565-788F-4A29-8919-7F3F001C6FC9}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WampSharp.Tests.Wampv2", "Tests\WampSharp.Tests.Wampv2\WampSharp.Tests.Wampv2.csproj", "{ECED5650-A8AF-4B0B-9C6E-BBAD9A147DFE}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WampSharp.Tests.TestHelpers", "Tests\WampSharp.Tests.TestHelpers\WampSharp.Tests.TestHelpers.csproj", "{EA8294AA-4DC7-4CD7-9916-00A590DB06BA}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WampSharp.AspNetCore.WebSockets.Server", "Extensions\WampSharp.AspNetCore.WebSockets.Server\WampSharp.AspNetCore.WebSockets.Server.csproj", "{EC3CAFF4-5635-4158-80CC-36AFC10ED645}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WampSharp.WebSockets", "Extensions\WampSharp.WebSockets\WampSharp.WebSockets.csproj", "{75AA7B6A-94E9-4EAA-9956-E88078FCD18E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WampSharp.NewtonsoftJson", "Default\WampSharp.NewtonsoftJson\WampSharp.NewtonsoftJson.csproj", "{B9B030B5-2C08-4243-BED9-F8BFB67A7121}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WampSharp.NewtonsoftMsgpack", "Default\WampSharp.NewtonsoftMsgpack\WampSharp.NewtonsoftMsgpack.csproj", "{84244F63-AF74-4684-898F-8DAA3866D0DC}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WampSharp.WebSocket4Net", "Default\WampSharp.WebSocket4Net\WampSharp.WebSocket4Net.csproj", "{78C4FB25-2EEA-4178-9D2E-447215A09A70}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WampSharp.Default.Client", "WampSharp.Default.Client\WampSharp.Default.Client.csproj", "{A68B9369-5EFB-43D4-979D-25DD0AAB540C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WampSharp.RawSocket", "Extensions\WampSharp.RawSocket\WampSharp.RawSocket.csproj", "{0A538377-4E4D-40B7-91D0-3E57AC40FE47}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WampSharp.WAMP1", "WampSharp.WAMP1\WampSharp.WAMP1.csproj", "{23F416C6-C878-4A1E-814E-CAF4331682D1}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WampSharp.Vtortola", "Extensions\WampSharp.Vtortola\WampSharp.Vtortola.csproj", "{5F6B51F6-1DA9-4D16-AEBD-BEC5F0E8E84D}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8EB8EF7A-FF96-4BA2-9662-C4882DBD1126}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8EB8EF7A-FF96-4BA2-9662-C4882DBD1126}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8EB8EF7A-FF96-4BA2-9662-C4882DBD1126}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8EB8EF7A-FF96-4BA2-9662-C4882DBD1126}.Release|Any CPU.Build.0 = Release|Any CPU
+ {ECED5650-A8AF-4B0B-9C6E-BBAD9A147DFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {ECED5650-A8AF-4B0B-9C6E-BBAD9A147DFE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {ECED5650-A8AF-4B0B-9C6E-BBAD9A147DFE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {ECED5650-A8AF-4B0B-9C6E-BBAD9A147DFE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EA8294AA-4DC7-4CD7-9916-00A590DB06BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EA8294AA-4DC7-4CD7-9916-00A590DB06BA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EA8294AA-4DC7-4CD7-9916-00A590DB06BA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EA8294AA-4DC7-4CD7-9916-00A590DB06BA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EC3CAFF4-5635-4158-80CC-36AFC10ED645}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EC3CAFF4-5635-4158-80CC-36AFC10ED645}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EC3CAFF4-5635-4158-80CC-36AFC10ED645}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EC3CAFF4-5635-4158-80CC-36AFC10ED645}.Release|Any CPU.Build.0 = Release|Any CPU
+ {75AA7B6A-94E9-4EAA-9956-E88078FCD18E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {75AA7B6A-94E9-4EAA-9956-E88078FCD18E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {75AA7B6A-94E9-4EAA-9956-E88078FCD18E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {75AA7B6A-94E9-4EAA-9956-E88078FCD18E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B9B030B5-2C08-4243-BED9-F8BFB67A7121}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B9B030B5-2C08-4243-BED9-F8BFB67A7121}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B9B030B5-2C08-4243-BED9-F8BFB67A7121}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B9B030B5-2C08-4243-BED9-F8BFB67A7121}.Release|Any CPU.Build.0 = Release|Any CPU
+ {84244F63-AF74-4684-898F-8DAA3866D0DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {84244F63-AF74-4684-898F-8DAA3866D0DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {84244F63-AF74-4684-898F-8DAA3866D0DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {84244F63-AF74-4684-898F-8DAA3866D0DC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {78C4FB25-2EEA-4178-9D2E-447215A09A70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {78C4FB25-2EEA-4178-9D2E-447215A09A70}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {78C4FB25-2EEA-4178-9D2E-447215A09A70}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {78C4FB25-2EEA-4178-9D2E-447215A09A70}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A68B9369-5EFB-43D4-979D-25DD0AAB540C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A68B9369-5EFB-43D4-979D-25DD0AAB540C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A68B9369-5EFB-43D4-979D-25DD0AAB540C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A68B9369-5EFB-43D4-979D-25DD0AAB540C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0A538377-4E4D-40B7-91D0-3E57AC40FE47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0A538377-4E4D-40B7-91D0-3E57AC40FE47}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0A538377-4E4D-40B7-91D0-3E57AC40FE47}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0A538377-4E4D-40B7-91D0-3E57AC40FE47}.Release|Any CPU.Build.0 = Release|Any CPU
+ {23F416C6-C878-4A1E-814E-CAF4331682D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {23F416C6-C878-4A1E-814E-CAF4331682D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {23F416C6-C878-4A1E-814E-CAF4331682D1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {23F416C6-C878-4A1E-814E-CAF4331682D1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5F6B51F6-1DA9-4D16-AEBD-BEC5F0E8E84D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5F6B51F6-1DA9-4D16-AEBD-BEC5F0E8E84D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5F6B51F6-1DA9-4D16-AEBD-BEC5F0E8E84D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5F6B51F6-1DA9-4D16-AEBD-BEC5F0E8E84D}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {ECED5650-A8AF-4B0B-9C6E-BBAD9A147DFE} = {4CADCB5B-7607-4B2C-A1C4-0550568AAE5D}
+ {EA8294AA-4DC7-4CD7-9916-00A590DB06BA} = {4CADCB5B-7607-4B2C-A1C4-0550568AAE5D}
+ {EC3CAFF4-5635-4158-80CC-36AFC10ED645} = {E3EAE72D-738A-4179-8A22-50D58A91AD04}
+ {75AA7B6A-94E9-4EAA-9956-E88078FCD18E} = {E3EAE72D-738A-4179-8A22-50D58A91AD04}
+ {B9B030B5-2C08-4243-BED9-F8BFB67A7121} = {72E8F565-788F-4A29-8919-7F3F001C6FC9}
+ {84244F63-AF74-4684-898F-8DAA3866D0DC} = {72E8F565-788F-4A29-8919-7F3F001C6FC9}
+ {78C4FB25-2EEA-4178-9D2E-447215A09A70} = {72E8F565-788F-4A29-8919-7F3F001C6FC9}
+ {0A538377-4E4D-40B7-91D0-3E57AC40FE47} = {E3EAE72D-738A-4179-8A22-50D58A91AD04}
+ {5F6B51F6-1DA9-4D16-AEBD-BEC5F0E8E84D} = {E3EAE72D-738A-4179-8A22-50D58A91AD04}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {9C83357C-2ED0-48F8-8468-E6531D94FBA3}
+ EndGlobalSection
+EndGlobal