diff --git a/README.md b/README.md index e11ec82b..7681501f 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,7 @@ To use it, add a setting like this to appsettings ```json "FileWSDL": { "UrlOverride": "", + "SchemeOverride": "", "VirtualPath": "", "WebServiceWSDLMapping": { "Service.asmx": { @@ -93,6 +94,7 @@ To use it, add a setting like this to appsettings ``` * UrlOverride - can be used to override the URL in the service description. This can be useful if you are behind a firewall. +* SchemeOverride - can be used to override the HTTP Scheme in the service description. This can be useful if you are behind a firewall and the firewall sets the X-Forwarded-Host header, but the internal HTTP scheme is not the same as the external. * VirualPath - can be used if you like to add a path between the base URL and service. * WebServiceWSDLMapping * UrlOverride - can be used to override the URL for a specific WSDL mapping. This can be useful if you want to host different services under different folder. diff --git a/src/SoapCore/SoapEndpointMiddleware.cs b/src/SoapCore/SoapEndpointMiddleware.cs index 4aba2bde..626fa381 100644 --- a/src/SoapCore/SoapEndpointMiddleware.cs +++ b/src/SoapCore/SoapEndpointMiddleware.cs @@ -7,11 +7,9 @@ using System.Net.Http.Headers; using System.Reflection; using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; using System.Security.Authentication; using System.ServiceModel; using System.ServiceModel.Channels; -using System.Text; using System.Threading.Tasks; using System.Xml; using Microsoft.AspNetCore.Connections; @@ -976,6 +974,29 @@ private void SetHttpResponse(HttpContext httpContext, Message message) } } + private string GetServerUrl(WsdlFileOptions options, HttpContext httpContext) + { + if (!string.IsNullOrEmpty(options.UrlOverride)) + { + return options.UrlOverride; + } + + if (options.UrlOverrideFunc != null) + { + return options.UrlOverrideFunc(options, httpContext); + } + + string scheme = string.IsNullOrEmpty(options.SchemeOverride) ? httpContext.Request.Scheme : options.SchemeOverride; + string host = httpContext.Request.Host.ToString(); + var forwardedHost = httpContext.Request.Headers["X-Forwarded-Host"]; + if (forwardedHost.Count != 0) + { + host = forwardedHost[0]; + } + + return scheme + "://" + host + "/"; + } + private MetaFromFile GetMeta(HttpContext httpContext) { var options = _options.WsdlFileOptions; @@ -990,16 +1011,7 @@ private MetaFromFile GetMeta(HttpContext httpContext) meta.WSDLFolder = mapping.WSDLFolder; meta.XsdFolder = mapping.SchemaFolder; - - if (options.UrlOverride != string.Empty) - { - meta.ServerUrl = options.UrlOverride; - } - else - { - meta.ServerUrl = httpContext.Request.Scheme + "://" + httpContext.Request.Host + "/"; - } - + meta.ServerUrl = GetServerUrl(options, httpContext); return meta; } @@ -1078,16 +1090,9 @@ private async Task ProcessMetaFromFile(HttpContext httpContext, bool showDocumen meta.CurrentWebService = mapping.UrlOverride; } - meta.XsdFolder = mapping.SchemaFolder; meta.WSDLFolder = mapping.WSDLFolder; - if (options.UrlOverride != string.Empty) - { - meta.ServerUrl = options.UrlOverride; - } - else - { - meta.ServerUrl = httpContext.Request.Scheme + "://" + httpContext.Request.Host + "/"; - } + meta.XsdFolder = mapping.SchemaFolder; + meta.ServerUrl = GetServerUrl(options, httpContext); string wsdlfile = mapping.WsdlFile; diff --git a/src/SoapCore/WSDLFileOptions.cs b/src/SoapCore/WSDLFileOptions.cs index 502b3639..a08d78ce 100644 --- a/src/SoapCore/WSDLFileOptions.cs +++ b/src/SoapCore/WSDLFileOptions.cs @@ -1,3 +1,4 @@ +using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; @@ -7,8 +8,10 @@ public class WsdlFileOptions { public virtual Dictionary WebServiceWSDLMapping { get; set; } = new Dictionary(); public string UrlOverride { get; set; } + public string SchemeOverride { get; set; } public string VirtualPath { get; set; } public string AppPath { get; set; } + public Func UrlOverrideFunc { get; set; } } public class WsdlFileOptionsCaseInsensitive : WsdlFileOptions