diff --git a/src/Web/Catalog.WebForms/Catalog.WebForms/Catalog.WebForms.csproj b/src/Web/Catalog.WebForms/Catalog.WebForms/Catalog.WebForms.csproj
index 40bd7bb2a..e71028818 100644
--- a/src/Web/Catalog.WebForms/Catalog.WebForms/Catalog.WebForms.csproj
+++ b/src/Web/Catalog.WebForms/Catalog.WebForms/Catalog.WebForms.csproj
@@ -57,6 +57,8 @@
+
+
@@ -415,6 +417,7 @@
+
Site.Master
ASPXCodeBehind
diff --git a/src/Web/Catalog.WebForms/Catalog.WebForms/Modules/AutoFacHttpModule.cs b/src/Web/Catalog.WebForms/Catalog.WebForms/Modules/AutoFacHttpModule.cs
index 471edbd18..53f9c9840 100644
--- a/src/Web/Catalog.WebForms/Catalog.WebForms/Modules/AutoFacHttpModule.cs
+++ b/src/Web/Catalog.WebForms/Catalog.WebForms/Modules/AutoFacHttpModule.cs
@@ -1,5 +1,6 @@
using Autofac;
using eShopOnContainers.Core.Services.Catalog;
+using eShopOnContainers.Core.Services.RequestProvider;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -34,8 +35,11 @@ namespace eShopOnContainers.Catalog.WebForms.Modules
}
else
{
- builder.RegisterType()
+ builder.RegisterType()
.As();
+
+ builder.RegisterType()
+ .As();
}
var container = builder.Build();
return container;
diff --git a/src/Web/Catalog.WebForms/Catalog.WebForms/Services/CatalogService.cs b/src/Web/Catalog.WebForms/Catalog.WebForms/Services/CatalogService.cs
index f77eb11d4..0a6339b3a 100644
--- a/src/Web/Catalog.WebForms/Catalog.WebForms/Services/CatalogService.cs
+++ b/src/Web/Catalog.WebForms/Catalog.WebForms/Services/CatalogService.cs
@@ -24,7 +24,7 @@ namespace eShopOnContainers.Core.Services.Catalog
try
{
// TODO:
- UriBuilder builder = new UriBuilder("" /* GlobalSetting.Instance.CatalogEndpoint */);
+ UriBuilder builder = new UriBuilder("http://catalog.api:5101");
builder.Path = string.Format("api/v1/catalog/items/type/{0}/brand/{1}", catalogTypeId, catalogBrandId);
@@ -49,7 +49,7 @@ namespace eShopOnContainers.Core.Services.Catalog
try
{
// TODO:
- UriBuilder builder = new UriBuilder("" /* GlobalSetting.Instance.CatalogEndpoint */);
+ UriBuilder builder = new UriBuilder("http://catalog.api:5101");
builder.Path = "api/v1/catalog/items";
@@ -83,7 +83,7 @@ namespace eShopOnContainers.Core.Services.Catalog
try
{
// TODO:
- UriBuilder builder = new UriBuilder("" /* GlobalSetting.Instance.CatalogEndpoint */);
+ UriBuilder builder = new UriBuilder("http://catalog.api:5101");
builder.Path = "api/v1/catalog/catalogbrands";
@@ -108,7 +108,7 @@ namespace eShopOnContainers.Core.Services.Catalog
try
{
// TODO:
- UriBuilder builder = new UriBuilder("" /* GlobalSetting.Instance.CatalogEndpoint */);
+ UriBuilder builder = new UriBuilder("http://catalog.api:5101");
builder.Path = "api/v1/catalog/catalogtypes";
@@ -131,7 +131,7 @@ namespace eShopOnContainers.Core.Services.Catalog
public Task DeleteCatalogItemAsync(string catalogItemId)
{
// TODO:
- UriBuilder builder = new UriBuilder("" /* GlobalSetting.Instance.CatalogEndpoint */);
+ UriBuilder builder = new UriBuilder("http://catalog.api:5101");
builder.Path = $"api/v1/catalog/{catalogItemId}";
@@ -143,7 +143,7 @@ namespace eShopOnContainers.Core.Services.Catalog
public Task UpdateCatalogItemAsync(CatalogItem item)
{
// TODO:
- UriBuilder builder = new UriBuilder("" /* GlobalSetting.Instance.CatalogEndpoint */);
+ UriBuilder builder = new UriBuilder("http://catalog.api:5101");
builder.Path = "api/v1/catalog/edit";
@@ -155,7 +155,7 @@ namespace eShopOnContainers.Core.Services.Catalog
public Task CreateCatalogItemAsync(CatalogItem item)
{
// TODO:
- UriBuilder builder = new UriBuilder("" /* GlobalSetting.Instance.CatalogEndpoint */);
+ UriBuilder builder = new UriBuilder("http://catalog.api:5101");
builder.Path = "api/v1/catalog/create";
diff --git a/src/Web/Catalog.WebForms/Catalog.WebForms/Services/RequestProvider.cs b/src/Web/Catalog.WebForms/Catalog.WebForms/Services/RequestProvider.cs
new file mode 100644
index 000000000..a35417eaa
--- /dev/null
+++ b/src/Web/Catalog.WebForms/Catalog.WebForms/Services/RequestProvider.cs
@@ -0,0 +1,174 @@
+using eShopOnContainers.Core.Exceptions;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Converters;
+using Newtonsoft.Json.Serialization;
+using System.Net;
+using System.Net.Http;
+using System.Net.Http.Headers;
+using System.Text;
+using System.Threading.Tasks;
+using System;
+
+// Taken from https://raw.githubusercontent.com/dotnet/eShopOnContainers/dev/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs
+// TODO: DRY This
+
+namespace eShopOnContainers.Core.Services.RequestProvider
+{
+ public class RequestProvider : IRequestProvider
+ {
+ private readonly JsonSerializerSettings _serializerSettings;
+
+ public RequestProvider()
+ {
+ _serializerSettings = new JsonSerializerSettings
+ {
+ ContractResolver = new CamelCasePropertyNamesContractResolver(),
+ DateTimeZoneHandling = DateTimeZoneHandling.Utc,
+ NullValueHandling = NullValueHandling.Ignore
+ };
+
+ _serializerSettings.Converters.Add(new StringEnumConverter());
+ }
+
+ public async Task GetAsync(string uri, string token = "")
+ {
+ HttpClient httpClient = CreateHttpClient(token);
+ HttpResponseMessage response = await httpClient.GetAsync(uri);
+
+ await HandleResponse(response);
+
+ string serialized = await response.Content.ReadAsStringAsync();
+
+ TResult result = await Task.Run(() =>
+ JsonConvert.DeserializeObject(serialized, _serializerSettings));
+
+ return result;
+ }
+
+ public async Task PostAsync(string uri, TResult data, string token = "", string header = "")
+ {
+ HttpClient httpClient = CreateHttpClient(token);
+
+ if (!string.IsNullOrEmpty(header))
+ {
+ AddHeaderParameter(httpClient, header);
+ }
+
+ var content = new StringContent(JsonConvert.SerializeObject(data));
+ content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
+ HttpResponseMessage response = await httpClient.PostAsync(uri, content);
+
+ await HandleResponse(response);
+
+ string serialized = await response.Content.ReadAsStringAsync();
+
+ TResult result = await Task.Run(() =>
+ JsonConvert.DeserializeObject(serialized, _serializerSettings));
+
+ return result;
+ }
+
+ public Task PostAsync(string uri, TResult data, string token = "")
+ {
+ return PostAsync(uri, data, token);
+ }
+
+ public async Task PostAsync(string uri, TRequest data, string token = "")
+ {
+ HttpClient httpClient = CreateHttpClient(token);
+ string serialized = await Task.Run(() => JsonConvert.SerializeObject(data, _serializerSettings));
+ var content = new StringContent(serialized, Encoding.UTF8, "application/json");
+ HttpResponseMessage response = await httpClient.PostAsync(uri, content);
+
+ await HandleResponse(response);
+
+ string responseData = await response.Content.ReadAsStringAsync();
+
+ return await Task.Run(() => JsonConvert.DeserializeObject(responseData, _serializerSettings));
+ }
+
+ public Task PutAsync(string uri, TResult data, string token = "")
+ {
+ return PutAsync(uri, data, token);
+ }
+
+ public async Task PutAsync(string uri, TRequest data, string token = "")
+ {
+ HttpClient httpClient = CreateHttpClient(token);
+ string serialized = await Task.Run(() => JsonConvert.SerializeObject(data, _serializerSettings));
+ HttpResponseMessage response = await httpClient.PutAsync(uri, new StringContent(serialized, Encoding.UTF8, "application/json"));
+
+ await HandleResponse(response);
+
+ string responseData = await response.Content.ReadAsStringAsync();
+
+ return await Task.Run(() => JsonConvert.DeserializeObject(responseData, _serializerSettings));
+ }
+
+ public async Task DeleteAsync(string uri, string token = "")
+ {
+ HttpClient httpClient = CreateHttpClient(token);
+
+ await httpClient.DeleteAsync(uri);
+ }
+
+ private HttpClient CreateHttpClient(string token = "")
+ {
+ var httpClient = new HttpClient();
+
+ httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
+
+ if (!string.IsNullOrEmpty(token))
+ {
+ httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
+ }
+
+ return httpClient;
+ }
+
+ private void AddHeaderParameter(HttpClient httpClient, string parameter)
+ {
+ if (httpClient == null)
+ return;
+
+ if (string.IsNullOrEmpty(parameter))
+ return;
+
+ httpClient.DefaultRequestHeaders.Add(parameter, Guid.NewGuid().ToString());
+ }
+
+ private async Task HandleResponse(HttpResponseMessage response)
+ {
+ if (!response.IsSuccessStatusCode)
+ {
+ var content = await response.Content.ReadAsStringAsync();
+
+ if (response.StatusCode == HttpStatusCode.Forbidden
+ || response.StatusCode == HttpStatusCode.Unauthorized)
+ {
+ throw new ServiceAuthenticationException(content);
+ }
+
+ throw new HttpRequestException(content);
+ }
+ }
+ }
+}
+
+// Taken from: https://raw.githubusercontent.com/dotnet/eShopOnContainers/dev/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Exceptions/ServiceAuthenticationException.cs
+namespace eShopOnContainers.Core.Exceptions
+{
+ public class ServiceAuthenticationException : Exception
+ {
+ public string Content { get; }
+
+ public ServiceAuthenticationException()
+ {
+ }
+
+ public ServiceAuthenticationException(string content)
+ {
+ Content = content;
+ }
+ }
+}
diff --git a/src/Web/Catalog.WebForms/Catalog.WebForms/Web.Debug.config b/src/Web/Catalog.WebForms/Catalog.WebForms/Web.Debug.config
new file mode 100644
index 000000000..15c33a329
--- /dev/null
+++ b/src/Web/Catalog.WebForms/Catalog.WebForms/Web.Debug.config
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Web/Catalog.WebForms/Catalog.WebForms/Web.config b/src/Web/Catalog.WebForms/Catalog.WebForms/Web.config
index 46d4ab24e..30a2748b0 100644
--- a/src/Web/Catalog.WebForms/Catalog.WebForms/Web.config
+++ b/src/Web/Catalog.WebForms/Catalog.WebForms/Web.config
@@ -9,7 +9,7 @@
-
+
diff --git a/src/Web/Catalog.WebForms/docker-compose.override.yml b/src/Web/Catalog.WebForms/docker-compose.override.yml
index dc74370aa..76aa2481d 100644
--- a/src/Web/Catalog.WebForms/docker-compose.override.yml
+++ b/src/Web/Catalog.WebForms/docker-compose.override.yml
@@ -20,8 +20,3 @@ services:
catalog.webforms:
ports:
- "80:80"
-
-networks:
- default:
- external:
- name: nat
diff --git a/src/Web/Catalog.WebForms/docker-compose.yml b/src/Web/Catalog.WebForms/docker-compose.yml
index 99cbd7914..7c13247b1 100644
--- a/src/Web/Catalog.WebForms/docker-compose.yml
+++ b/src/Web/Catalog.WebForms/docker-compose.yml
@@ -19,3 +19,8 @@ services:
sql.data:
image: microsoft/mssql-server-windows
+
+networks:
+ default:
+ external:
+ name: nat