8
8
using Microsoft . Extensions . DependencyInjection ;
9
9
using Microsoft . Extensions . Logging ;
10
10
using Solid . AspNetCore . Extensions . Wcf . ServiceModel . Channels . AspNetCore ;
11
+ using Microsoft . AspNetCore . Hosting . Server ;
12
+ using Microsoft . AspNetCore . Hosting . Server . Features ;
11
13
12
14
namespace Solid . AspNetCore . Extensions . Wcf . Services
13
15
{
14
16
internal class BindingSanitizer : IBindingSanitizer
15
17
{
16
18
private IServiceProvider _services ;
19
+ private IServer _server ;
17
20
18
- public BindingSanitizer ( IServiceProvider services )
21
+ public BindingSanitizer ( IServiceProvider services , IServer server )
19
22
{
20
23
_services = services ;
24
+ _server = server ;
21
25
}
22
26
23
27
public Binding SanitizeBinding ( Binding binding )
@@ -37,19 +41,52 @@ public Binding SanitizeBinding(Binding binding)
37
41
}
38
42
39
43
private void Replace < TTransport > ( CustomBinding custom )
40
- where TTransport : TransportBindingElement
44
+ where TTransport : HttpTransportBindingElement
41
45
{
42
46
var current = custom . Elements . OfType < TTransport > ( ) . FirstOrDefault ( ) ;
43
- if ( current != null )
44
- {
45
- custom . Elements . Remove ( current ) ;
46
- //custom.Elements.Add(new HttpTransportBindingElement());
47
- var handler = _services . GetService < IAspNetCoreHandler > ( ) ;
48
- var factory = _services . GetService < IMessageFactory > ( ) ;
49
- var loggerFactory = _services . GetService < ILoggerFactory > ( ) ;
50
- var aspNetCore = new AspNetCoreTransportBindingElement ( current . Scheme , handler , factory , loggerFactory ) ;
51
- custom . Elements . Add ( aspNetCore ) ;
52
- }
47
+ if ( current == null ) return ;
48
+ if ( current is AspNetCoreTransportBindingElement ) return ;
49
+
50
+ custom . Elements . Remove ( current ) ;
51
+ //custom.Elements.Add(new HttpTransportBindingElement());
52
+ var handler = _services . GetService < IAspNetCoreHandler > ( ) ;
53
+ var factory = _services . GetService < IMessageFactory > ( ) ;
54
+ var loggerFactory = _services . GetService < ILoggerFactory > ( ) ;
55
+ var scheme = GetScheme ( current ) ;
56
+ var aspNetCore = new AspNetCoreTransportBindingElement ( scheme , handler , factory , loggerFactory ) ;
57
+
58
+ aspNetCore . AllowCookies = current . AllowCookies ;
59
+ aspNetCore . AuthenticationScheme = current . AuthenticationScheme ;
60
+ aspNetCore . BypassProxyOnLocal = current . BypassProxyOnLocal ;
61
+ aspNetCore . DecompressionEnabled = current . DecompressionEnabled ;
62
+ aspNetCore . ExtendedProtectionPolicy = current . ExtendedProtectionPolicy ;
63
+ aspNetCore . HostNameComparisonMode = current . HostNameComparisonMode ;
64
+ aspNetCore . KeepAliveEnabled = current . KeepAliveEnabled ;
65
+ aspNetCore . ManualAddressing = current . ManualAddressing ;
66
+ aspNetCore . MaxBufferPoolSize = current . MaxBufferPoolSize ;
67
+ aspNetCore . MaxBufferSize = current . MaxBufferSize ;
68
+ aspNetCore . MaxPendingAccepts = current . MaxPendingAccepts ;
69
+ aspNetCore . MaxReceivedMessageSize = current . MaxReceivedMessageSize ;
70
+ aspNetCore . MessageHandlerFactory = current . MessageHandlerFactory ;
71
+ aspNetCore . ProxyAddress = current . ProxyAddress ;
72
+ aspNetCore . ProxyAuthenticationScheme = current . ProxyAuthenticationScheme ;
73
+ aspNetCore . Realm = current . Realm ;
74
+ aspNetCore . RequestInitializationTimeout = current . RequestInitializationTimeout ;
75
+ aspNetCore . TransferMode = current . TransferMode ;
76
+ aspNetCore . UnsafeConnectionNtlmAuthentication = current . UnsafeConnectionNtlmAuthentication ;
77
+ aspNetCore . UseDefaultWebProxy = current . UseDefaultWebProxy ;
78
+ aspNetCore . WebSocketSettings = current . WebSocketSettings ;
79
+
80
+ custom . Elements . Add ( aspNetCore ) ;
81
+ }
82
+
83
+ private string GetScheme ( HttpTransportBindingElement original )
84
+ {
85
+ var feature = _server . Features [ typeof ( IServerAddressesFeature ) ] as IServerAddressesFeature ;
86
+ var addresses = feature . Addresses . Select ( s => new Uri ( s ) ) ;
87
+
88
+ if ( addresses . Any ( u => u . Scheme == "https" ) ) return original . Scheme ;
89
+ return "http" ;
53
90
}
54
91
}
55
92
}
0 commit comments