diff --git a/.travis.yml b/.travis.yml index 4965a261c5..e9a98166a3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ addons: - libunwind8 - zlib1g env: - - KOREBUILD_DNU_RESTORE_CORECLR=true + - KOREBUILD_DNU_RESTORE_CORECLR=true KOREBUILD_TEST_DNXCORE=true install: - curl -sSL https://github.com/libuv/libuv/archive/v1.4.2.tar.gz | tar zxfv - -C /tmp && cd /tmp/libuv-1.4.2/ - sh autogen.sh diff --git a/src/MusicStore/TestMIddleware.cs b/src/MusicStore/TestMIddleware.cs new file mode 100644 index 0000000000..e35089a65f --- /dev/null +++ b/src/MusicStore/TestMIddleware.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNet.Http; +using Microsoft.Extensions.Logging; + +namespace MusicStore +{ + public class MyMiddleware + { + private RequestDelegate _next; + private readonly ILogger _logger; + + public MyMiddleware(RequestDelegate next, ILogger logger) + { + _next = next; + _logger = logger; + } + + public async Task Invoke(HttpContext httpContext) + { + var requestBuilder = new StringBuilder(); + requestBuilder.AppendFormat("Request:{0}{1}{2} ||", httpContext.Request.Method, httpContext.Request.Path, httpContext.Request.QueryString); + foreach (var header in httpContext.Request.Headers) + { + requestBuilder.Append(header.Key + ": " + header.Value + " || "); + } + _logger.LogWarning(requestBuilder.ToString()); + + await _next.Invoke(httpContext); + + var responseBuilder = new StringBuilder(); + responseBuilder.AppendFormat("Response:{0} {1} {2}{3} ||", httpContext.Response.StatusCode, httpContext.Request.Method, httpContext.Request.Path, httpContext.Request.QueryString); + foreach (var header in httpContext.Response.Headers) + { + responseBuilder.Append(header.Key + ": " + header.Value + " || "); + } + _logger.LogWarning(responseBuilder.ToString()); + } + } +} diff --git a/test/E2ETests/Implementation/FacebookLoginScenarios.cs b/test/E2ETests/Implementation/FacebookLoginScenarios.cs index 0bdacd0c29..0f98e0c34f 100644 --- a/test/E2ETests/Implementation/FacebookLoginScenarios.cs +++ b/test/E2ETests/Implementation/FacebookLoginScenarios.cs @@ -42,7 +42,7 @@ namespace E2ETests Assert.NotNull(_httpClientHandler.CookieContainer.GetCookies(new Uri(_deploymentResult.ApplicationBaseUri)).GetCookieWithName(".AspNet.Correlation.Facebook")); //This is just to generate a correlation cookie. Previous step would generate this cookie, but we have reset the handler now. - _httpClientHandler = new HttpClientHandler() { AllowAutoRedirect = true }; + _httpClientHandler = new HttpClientHandler() { AllowAutoRedirect = false }; _httpClient = new HttpClient(_httpClientHandler) { BaseAddress = new Uri(_deploymentResult.ApplicationBaseUri) }; response = await _httpClient.GetAsync("Account/Login"); @@ -56,9 +56,10 @@ namespace E2ETests content = new FormUrlEncodedContent(formParameters.ToArray()); response = await _httpClient.PostAsync("Account/ExternalLogin", content); - + response = await _httpClient.GetAsync(response.Headers.Location); //Post a message to the Facebook middleware response = await _httpClient.GetAsync("signin-facebook?code=ValidCode&state=ValidStateData"); + response = await _httpClient.GetAsync(response.Headers.Location); await ThrowIfResponseStatusNotOk(response); responseContent = await response.Content.ReadAsStringAsync(); @@ -78,6 +79,7 @@ namespace E2ETests content = new FormUrlEncodedContent(formParameters.ToArray()); response = await _httpClient.PostAsync("Account/ExternalLoginConfirmation", content); + response = await _httpClient.GetAsync(response.Headers.Location); await ThrowIfResponseStatusNotOk(response); responseContent = await response.Content.ReadAsStringAsync(); diff --git a/test/E2ETests/Implementation/GoogleLoginScenarios.cs b/test/E2ETests/Implementation/GoogleLoginScenarios.cs index 2a733ca280..a75c1a0a1e 100644 --- a/test/E2ETests/Implementation/GoogleLoginScenarios.cs +++ b/test/E2ETests/Implementation/GoogleLoginScenarios.cs @@ -43,7 +43,7 @@ namespace E2ETests Assert.NotNull(_httpClientHandler.CookieContainer.GetCookies(new Uri(_deploymentResult.ApplicationBaseUri)).GetCookieWithName(".AspNet.Correlation.Google")); //This is just to generate a correlation cookie. Previous step would generate this cookie, but we have reset the handler now. - _httpClientHandler = new HttpClientHandler() { AllowAutoRedirect = true }; + _httpClientHandler = new HttpClientHandler() { AllowAutoRedirect = false }; _httpClient = new HttpClient(_httpClientHandler) { BaseAddress = new Uri(_deploymentResult.ApplicationBaseUri) }; response = await _httpClient.GetAsync("Account/Login"); @@ -60,6 +60,7 @@ namespace E2ETests //Post a message to the Google middleware response = await _httpClient.GetAsync("signin-google?code=ValidCode&state=ValidStateData"); + response = await _httpClient.GetAsync(response.Headers.Location); await ThrowIfResponseStatusNotOk(response); responseContent = await response.Content.ReadAsStringAsync(); @@ -79,6 +80,7 @@ namespace E2ETests content = new FormUrlEncodedContent(formParameters.ToArray()); response = await _httpClient.PostAsync("Account/ExternalLoginConfirmation", content); + response = await _httpClient.GetAsync(response.Headers.Location); await ThrowIfResponseStatusNotOk(response); responseContent = await response.Content.ReadAsStringAsync(); diff --git a/test/E2ETests/Implementation/MicrosoftAccountAuthenticationScenarios.cs b/test/E2ETests/Implementation/MicrosoftAccountAuthenticationScenarios.cs index 28efcdae64..eba31511e4 100644 --- a/test/E2ETests/Implementation/MicrosoftAccountAuthenticationScenarios.cs +++ b/test/E2ETests/Implementation/MicrosoftAccountAuthenticationScenarios.cs @@ -43,7 +43,7 @@ namespace E2ETests Assert.NotNull(_httpClientHandler.CookieContainer.GetCookies(new Uri(_deploymentResult.ApplicationBaseUri)).GetCookieWithName(".AspNet.Correlation.Microsoft")); //This is just to generate a correlation cookie. Previous step would generate this cookie, but we have reset the handler now. - _httpClientHandler = new HttpClientHandler() { AllowAutoRedirect = true }; + _httpClientHandler = new HttpClientHandler() { AllowAutoRedirect = false }; _httpClient = new HttpClient(_httpClientHandler) { BaseAddress = new Uri(_deploymentResult.ApplicationBaseUri) }; response = await _httpClient.GetAsync("Account/Login"); @@ -57,9 +57,10 @@ namespace E2ETests content = new FormUrlEncodedContent(formParameters.ToArray()); response = await _httpClient.PostAsync("Account/ExternalLogin", content); - + response = await _httpClient.GetAsync(response.Headers.Location); //Post a message to the MicrosoftAccount middleware response = await _httpClient.GetAsync("signin-microsoft?code=ValidCode&state=ValidStateData"); + response = await _httpClient.GetAsync(response.Headers.Location); await ThrowIfResponseStatusNotOk(response); responseContent = await response.Content.ReadAsStringAsync(); @@ -78,6 +79,7 @@ namespace E2ETests content = new FormUrlEncodedContent(formParameters.ToArray()); response = await _httpClient.PostAsync("Account/ExternalLoginConfirmation", content); + response = await _httpClient.GetAsync(response.Headers.Location); await ThrowIfResponseStatusNotOk(response); responseContent = await response.Content.ReadAsStringAsync(); diff --git a/test/E2ETests/Implementation/TwitterLoginScenarios.cs b/test/E2ETests/Implementation/TwitterLoginScenarios.cs index 44cfdcef11..00d969098b 100644 --- a/test/E2ETests/Implementation/TwitterLoginScenarios.cs +++ b/test/E2ETests/Implementation/TwitterLoginScenarios.cs @@ -41,7 +41,7 @@ namespace E2ETests Assert.NotNull(_httpClientHandler.CookieContainer.GetCookies(new Uri(_deploymentResult.ApplicationBaseUri))["__TwitterState"]); //This is just to generate a correlation cookie. Previous step would generate this cookie, but we have reset the handler now. - _httpClientHandler = new HttpClientHandler() { AllowAutoRedirect = true }; + _httpClientHandler = new HttpClientHandler() { AllowAutoRedirect = false }; _httpClient = new HttpClient(_httpClientHandler) { BaseAddress = new Uri(_deploymentResult.ApplicationBaseUri) }; response = await _httpClient.GetAsync("Account/Login"); @@ -55,9 +55,10 @@ namespace E2ETests content = new FormUrlEncodedContent(formParameters.ToArray()); response = await _httpClient.PostAsync("Account/ExternalLogin", content); - + response = await _httpClient.GetAsync(response.Headers.Location); //Post a message to the Facebook middleware response = await _httpClient.GetAsync("signin-twitter?oauth_token=valid_oauth_token&oauth_verifier=valid_oauth_verifier"); + response = await _httpClient.GetAsync(response.Headers.Location); await ThrowIfResponseStatusNotOk(response); responseContent = await response.Content.ReadAsStringAsync(); @@ -78,6 +79,7 @@ namespace E2ETests content = new FormUrlEncodedContent(formParameters.ToArray()); response = await _httpClient.PostAsync("Account/ExternalLoginConfirmation", content); + response = await _httpClient.GetAsync(response.Headers.Location); await ThrowIfResponseStatusNotOk(response); responseContent = await response.Content.ReadAsStringAsync(); diff --git a/test/E2ETests/Implementation/Validator.cs b/test/E2ETests/Implementation/Validator.cs index f1aec1f761..b5e9592924 100644 --- a/test/E2ETests/Implementation/Validator.cs +++ b/test/E2ETests/Implementation/Validator.cs @@ -140,7 +140,7 @@ namespace E2ETests { _logger.LogInformation("Trying to access StoreManager that needs ManageStore claim with the current user : {email}", email ?? "Anonymous"); var response = await _httpClient.GetAsync("Admin/StoreManager/"); - await ThrowIfResponseStatusNotOk(response); + response = await _httpClient.GetAsync(response.Headers.Location); var responseContent = await response.Content.ReadAsStringAsync(); ValidateLayoutPage(responseContent); @@ -254,6 +254,7 @@ namespace E2ETests var content = new FormUrlEncodedContent(formParameters.ToArray()); response = await _httpClient.PostAsync("Account/LogOff", content); + response = await _httpClient.GetAsync(response.Headers.Location); responseContent = await response.Content.ReadAsStringAsync(); if (!Helpers.RunningOnMono) @@ -312,6 +313,7 @@ namespace E2ETests var content = new FormUrlEncodedContent(formParameters.ToArray()); response = await _httpClient.PostAsync("Account/Login", content); + response = await _httpClient.GetAsync(response.Headers.Location); responseContent = await response.Content.ReadAsStringAsync(); Assert.Contains(string.Format("Hello {0}!", email), responseContent, StringComparison.OrdinalIgnoreCase); Assert.Contains("Log off", responseContent, StringComparison.OrdinalIgnoreCase); @@ -335,6 +337,7 @@ namespace E2ETests var content = new FormUrlEncodedContent(formParameters.ToArray()); response = await _httpClient.PostAsync("Manage/ChangePassword", content); + response = await _httpClient.GetAsync(response.Headers.Location); responseContent = await response.Content.ReadAsStringAsync(); Assert.Contains("Your password has been changed.", responseContent, StringComparison.OrdinalIgnoreCase); Assert.NotNull(_httpClientHandler.CookieContainer.GetCookies(new Uri(_deploymentResult.ApplicationBaseUri)).GetCookieWithName(".AspNet.Microsoft.AspNet.Identity.Application")); @@ -360,6 +363,7 @@ namespace E2ETests var content = new FormUrlEncodedContent(formParameters.ToArray()); response = await _httpClient.PostAsync("Admin/StoreManager/create", content); + response = await _httpClient.GetAsync(response.Headers.Location); responseContent = await response.Content.ReadAsStringAsync(); Assert.Equal(_deploymentResult.ApplicationBaseUri + "Admin/StoreManager", response.RequestMessage.RequestUri.AbsoluteUri); Assert.Contains(albumName, responseContent); @@ -405,6 +409,7 @@ namespace E2ETests { _logger.LogInformation("Getting details of a non-existing album with Id '-1'"); var response = await _httpClient.GetAsync("Admin/StoreManager/Details?id=-1"); + response = await _httpClient.GetAsync(response.Headers.Location); await ThrowIfResponseStatusNotOk(response); var responseContent = await response.Content.ReadAsStringAsync(); Assert.Contains("Item not found.", responseContent, StringComparison.OrdinalIgnoreCase); @@ -425,6 +430,7 @@ namespace E2ETests { _logger.LogInformation("Adding album id '{albumId}' to the cart", albumId); var response = await _httpClient.GetAsync(string.Format("ShoppingCart/AddToCart?id={0}", albumId)); + response = await _httpClient.GetAsync(response.Headers.Location); await ThrowIfResponseStatusNotOk(response); var responseContent = await response.Content.ReadAsStringAsync(); Assert.Contains(albumName, responseContent, StringComparison.OrdinalIgnoreCase); @@ -456,6 +462,7 @@ namespace E2ETests var content = new FormUrlEncodedContent(formParameters.ToArray()); response = await _httpClient.PostAsync("Checkout/AddressAndPayment", content); + response = await _httpClient.GetAsync(response.Headers.Location); responseContent = await response.Content.ReadAsStringAsync(); Assert.Contains("

Checkout Complete

", responseContent, StringComparison.OrdinalIgnoreCase); Assert.StartsWith(_deploymentResult.ApplicationBaseUri + "Checkout/Complete/", response.RequestMessage.RequestUri.AbsoluteUri, StringComparison.OrdinalIgnoreCase); @@ -472,6 +479,7 @@ namespace E2ETests var content = new FormUrlEncodedContent(formParameters.ToArray()); var response = await _httpClient.PostAsync("Admin/StoreManager/RemoveAlbum", content); + response = await _httpClient.GetAsync(response.Headers.Location); await ThrowIfResponseStatusNotOk(response); _logger.LogInformation("Verifying if the album '{album}' is deleted from store", albumName); diff --git a/test/E2ETests/NtlmAuthentationTest.cs b/test/E2ETests/NtlmAuthentationTest.cs index 03d48a4d6f..71f2c61736 100644 --- a/test/E2ETests/NtlmAuthentationTest.cs +++ b/test/E2ETests/NtlmAuthentationTest.cs @@ -53,7 +53,7 @@ namespace E2ETests using (var deployer = ApplicationDeployerFactory.Create(deploymentParameters, logger)) { var deploymentResult = deployer.Deploy(); - var httpClientHandler = new HttpClientHandler() { UseDefaultCredentials = true }; + var httpClientHandler = new HttpClientHandler() { UseDefaultCredentials = true, AllowAutoRedirect = false }; var httpClient = new HttpClient(httpClientHandler) { BaseAddress = new Uri(deploymentResult.ApplicationBaseUri) }; // Request to base address and check if various parts of the body are rendered & measure the cold startup time. diff --git a/test/E2ETests/OpenIdConnectTests.cs b/test/E2ETests/OpenIdConnectTests.cs index 7a75174b63..d528aed34f 100644 --- a/test/E2ETests/OpenIdConnectTests.cs +++ b/test/E2ETests/OpenIdConnectTests.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNet.Server.Testing; +using Microsoft.AspNet.Testing; using Microsoft.AspNet.Testing.xunit; using Microsoft.Extensions.Logging; using Xunit; @@ -59,7 +60,8 @@ namespace E2ETests EnvironmentName = "OpenIdConnectTesting", UserAdditionalCleanup = parameters => { - if (!Helpers.RunningOnMono) + if (!Helpers.RunningOnMono + && TestPlatformHelper.IsWindows) { // Mono uses InMemoryStore DbUtils.DropDatabase(musicStoreDbName, logger); @@ -76,7 +78,7 @@ namespace E2ETests using (var deployer = ApplicationDeployerFactory.Create(deploymentParameters, logger)) { var deploymentResult = deployer.Deploy(); - var httpClientHandler = new HttpClientHandler(); + var httpClientHandler = new HttpClientHandler() { AllowAutoRedirect = false }; var httpClient = new HttpClient(httpClientHandler) { BaseAddress = new Uri(deploymentResult.ApplicationBaseUri) }; // Request to base address and check if various parts of the body are rendered & measure the cold startup time. diff --git a/test/E2ETests/PublishAndRunTests.cs b/test/E2ETests/PublishAndRunTests.cs index 62f586a017..ad2bf6996d 100644 --- a/test/E2ETests/PublishAndRunTests.cs +++ b/test/E2ETests/PublishAndRunTests.cs @@ -4,6 +4,7 @@ using System.IO; using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNet.Server.Testing; +using Microsoft.AspNet.Testing; using Microsoft.AspNet.Testing.xunit; using Microsoft.Extensions.Logging; using Xunit; @@ -16,10 +17,10 @@ namespace E2ETests [ConditionalTheory, Trait("E2Etests", "E2Etests")] [OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.MacOSX)] - [InlineData(ServerType.WebListener, RuntimeFlavor.Clr, RuntimeArchitecture.x64, "http://localhost:5025/", false)] + //[InlineData(ServerType.WebListener, RuntimeFlavor.Clr, RuntimeArchitecture.x64, "http://localhost:5025/", false)] //[InlineData(ServerType.WebListener, RuntimeFlavor.CoreClr, RuntimeArchitecture.x64, "http://localhost:5026/", false)] [InlineData(ServerType.Kestrel, RuntimeFlavor.Clr, RuntimeArchitecture.x64, "http://localhost:5027/", false)] - //[InlineData(ServerType.Kestrel, RuntimeFlavor.CoreClr, RuntimeArchitecture.x64, "http://localhost:5028/", false)] + [InlineData(ServerType.Kestrel, RuntimeFlavor.CoreClr, RuntimeArchitecture.x64, "http://localhost:5028/", false)] public async Task WindowsOS( ServerType serverType, RuntimeFlavor runtimeFlavor, @@ -32,7 +33,7 @@ namespace E2ETests serverType, runtimeFlavor, architecture, applicationBaseUrl, noSource); } - [ConditionalTheory(Skip = "Bug https://github.com/aspnet/dnx/issues/2958"), Trait("E2Etests", "E2Etests")] + [ConditionalTheory, Trait("E2Etests", "E2Etests")] [OSSkipCondition(OperatingSystems.Windows)] [InlineData(ServerType.Kestrel, RuntimeFlavor.CoreClr, RuntimeArchitecture.x64, "http://localhost:5030/", false)] public async Task NonWindowsOS( @@ -53,10 +54,10 @@ namespace E2ETests [ConditionalTheory, Trait("E2Etests", "E2Etests")] [OSSkipCondition(OperatingSystems.Linux)] [OSSkipCondition(OperatingSystems.MacOSX)] - [InlineData(ServerType.WebListener, RuntimeFlavor.Clr, RuntimeArchitecture.x86, "http://localhost:5031/", false)] + //[InlineData(ServerType.WebListener, RuntimeFlavor.Clr, RuntimeArchitecture.x86, "http://localhost:5031/", false)] //[InlineData(ServerType.WebListener, RuntimeFlavor.CoreClr, RuntimeArchitecture.x86, "http://localhost:5032/", false)] [InlineData(ServerType.Kestrel, RuntimeFlavor.Clr, RuntimeArchitecture.x86, "http://localhost:5033/", false)] - //[InlineData(ServerType.Kestrel, RuntimeFlavor.CoreClr, RuntimeArchitecture.x86, "http://localhost:5034/", false)] + [InlineData(ServerType.Kestrel, RuntimeFlavor.CoreClr, RuntimeArchitecture.x86, "http://localhost:5034/", false)] public async Task WindowsOS( ServerType serverType, RuntimeFlavor runtimeFlavor, @@ -95,7 +96,7 @@ namespace E2ETests bool noSource) { var logger = new LoggerFactory() - .AddConsole(LogLevel.Warning) + .AddConsole(LogLevel.Information) .CreateLogger($"Publish:{serverType}:{runtimeFlavor}:{architecture}:{noSource}"); using (logger.BeginScope("Publish_And_Run_Tests")) @@ -111,7 +112,8 @@ namespace E2ETests PublishWithNoSource = noSource, UserAdditionalCleanup = parameters => { - if (!Helpers.RunningOnMono) + if (!Helpers.RunningOnMono + && TestPlatformHelper.IsWindows) { // Mono uses InMemoryStore DbUtils.DropDatabase(musicStoreDbName, logger); @@ -128,7 +130,7 @@ namespace E2ETests using (var deployer = ApplicationDeployerFactory.Create(deploymentParameters, logger)) { var deploymentResult = deployer.Deploy(); - var httpClientHandler = new HttpClientHandler() { UseDefaultCredentials = true }; + var httpClientHandler = new HttpClientHandler() { UseDefaultCredentials = true, AllowAutoRedirect = false }; var httpClient = new HttpClient(httpClientHandler); httpClient.BaseAddress = new Uri(deploymentResult.ApplicationBaseUri); diff --git a/test/E2ETests/SmokeTests.cs b/test/E2ETests/SmokeTests.cs index 370f974532..605421daff 100644 --- a/test/E2ETests/SmokeTests.cs +++ b/test/E2ETests/SmokeTests.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNet.Server.Testing; +using Microsoft.AspNet.Testing; using Microsoft.AspNet.Testing.xunit; using Microsoft.Extensions.Logging; using Xunit; @@ -123,6 +124,7 @@ namespace E2ETests UserAdditionalCleanup = parameters => { if (!Helpers.RunningOnMono + && TestPlatformHelper.IsWindows && parameters.ServerType != ServerType.IIS) { // Mono uses InMemoryStore @@ -142,7 +144,11 @@ namespace E2ETests var deploymentResult = deployer.Deploy(); Helpers.SetInMemoryStoreForIIS(deploymentParameters, logger); - var httpClientHandler = new HttpClientHandler(); + var httpClientHandler = new HttpClientHandler() + { + // Temporary workaround for issue https://github.com/dotnet/corefx/issues/4960 + AllowAutoRedirect = false + }; var httpClient = new HttpClient(httpClientHandler) { BaseAddress = new Uri(deploymentResult.ApplicationBaseUri), diff --git a/test/E2ETests/project.json b/test/E2ETests/project.json index 7ffc5a56a2..52fc777bf1 100644 --- a/test/E2ETests/project.json +++ b/test/E2ETests/project.json @@ -1,29 +1,29 @@ { - "compilationOptions": { - "warningsAsErrors": true - }, - "compile": [ - "../../shared/**/*.cs" - ], - "commands": { - "test": "xunit.runner.aspnet" - }, - "dependencies": { - "Microsoft.AspNet.Authentication.OpenIdConnect": "1.0.0-*", - "Microsoft.AspNet.Server.IIS": "1.0.0-*", - "Microsoft.AspNet.Server.Testing": "1.0.0-*", - "Microsoft.AspNet.WebUtilities": "1.0.0-*", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-*", - "Microsoft.Extensions.Logging.Console": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "frameworks": { - "dnx451": { - "frameworkAssemblies": { - "System.Data": "", - "System.Net.Http": "", - "System.Xml": "" - } + "compilationOptions": { + "warningsAsErrors": true + }, + "compile": [ + "../../shared/**/*.cs" + ], + "commands": { + "test": "xunit.runner.aspnet" + }, + "dependencies": { + "Microsoft.AspNet.Authentication.OpenIdConnect": "1.0.0-*", + "Microsoft.AspNet.Server.IIS": "1.0.0-*", + "Microsoft.AspNet.Server.Testing": "1.0.0-*", + "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-*", + "Microsoft.Extensions.Logging.Console": "1.0.0-*", + "xunit.runner.aspnet": "2.0.0-aspnet-*" + }, + "frameworks": { + "dnxcore50": { + "dependencies": { + "System.Data.SqlClient": "4.0.0-*", + "System.Net.Http": "4.0.1-*", + "System.Xml.XmlDocument": "4.0.0-*" + } + } } - } } \ No newline at end of file