Skip to content

Consumption

FaxService.SendFax constructs a FaxServiceProxy per invocation, which in turn builds a code-configured BasicHttpBinding and endpoint address, constructs the generated FaxServiceSoapClient directly, and invokes Send once per recipient synchronously.

Reference style

Field Value
Mechanism Service Reference (svcutil / Add Service Reference)
Declared in src\WCF\SAIF.Services.WCF.Host\WCF.csproj
Generated artifacts src\WCF\SAIF.Services.WCF.Host\Service References\Legacy.Fax\Reference.cs
Target framework .NET Framework 4.x
Regeneration command Visual Studio "Update Service Reference"

No hand edit was found inside the generated Reference.cs; a refresh carries no known loss*.

Construction

var binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly);
binding.MaxReceivedMessageSize = int.MaxValue;
binding.MaxBufferSize = int.MaxValue;
binding.ReaderQuotas.MaxArrayLength = int.MaxValue;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
webService = new FaxServiceSoapClient(binding, new EndpointAddress(serviceUrl));
Step Requirement
Endpoint address Obtained from the environment configuration service via EnvironmentConfigKeys.FaxSoapServiceUrl — see Endpoint resolution
Binding Constructed in code
Credentials Windows transport credential (HttpClientCredentialType.Windows) — no credential value is supplied in code or configuration
Initialization Single-constructor; no follow-up property assignment

Endpoint configuration

Setting Value Source Changeable without a rebuild
Endpoint address Resolved from the environment configuration service — see Endpoint resolution src\WCF\SAIF.Services.WCF.Host\Services\FaxService.cs:21-25 Yes — resolved per request from the environment service*
Binding configuration Constructed in code src\WCF\SAIF.Services.WCF.Host\Services\LegacyProxies\FaxServiceProxy.cs:17 No
Security mode BasicHttpSecurityMode.TransportCredentialOnly src\WCF\SAIF.Services.WCF.Host\Services\LegacyProxies\FaxServiceProxy.cs:17 No

The configured <system.serviceModel><client><endpoint> in Web.config/Web.Base.config is not consulted by this construction path at all; see Endpoint resolution for the full finding.

Resilience

Concern Finding Configurable by consumer Source Tech debt
Timeout None configured — binding defaults apply No src\WCF\SAIF.Services.WCF.Host\Services\LegacyProxies\FaxServiceProxy.cs:17-27 Yes
Retry None configured No — Yes
Circuit breaking None configured No — Yes
Thread safety Not determined from source — src\WCF\SAIF.Services.WCF.Host\Services\LegacyProxies\FaxServiceProxy.cs No
Cancellation Not supported — no cancellation token on any call site — src\WCF\SAIF.Services.WCF.Host\Services\LegacyProxies\FaxServiceProxy.cs:41 Yes
Message size limits MaxReceivedMessageSize/MaxBufferSize/ReaderQuotas.MaxArrayLength all int.MaxValue No src\WCF\SAIF.Services.WCF.Host\Services\LegacyProxies\FaxServiceProxy.cs:19-24 Yes

No retry policy exists at either call site, so any transient failure of the remote service surfaces directly to the caller of the hosted FaxService.SendFax operation, which itself has no try/catch around the call and no compensating cleanup for a fax already partially sent to earlier recipients. No timeout is set on the code-constructed binding or on the unreferenced configured binding, so a hung call blocks on the transport default rather than a stated intent — see Tech debt. The message-size quotas set to int.MaxValue remove the guard that limits how large a response the process will accept, also raised in Tech debt.

Disposal

Aspect Finding
Disposal performed Close() only
Faulted channel handled No — a faulted channel throws from Close(), masking the original failure*
Wrapper responsibility FaxServiceProxy.Dispose(bool) disposes the proxy
Source src\WCF\SAIF.Services.WCF.Host\Services\LegacyProxies\FaxServiceProxy.cs:55-63
protected virtual void Dispose(bool disposing)
{
    if (disposing)
    {
        webService.Close();
    }
}

Error handling for consumers

Failure Surfaces as Consumer action
Service unreachable CommunicationException Not handled — propagates unchanged to the hosted FaxService.SendFax operation, and from there to the service-wide [LogErrorBehavior] handler
SOAP fault returned FaultException / FaultException<T> Not handled — propagates unchanged
Timeout exceeded TimeoutException Not handled — propagates unchanged
Response larger than the message size limit Not applicable — quotas are set to int.MaxValue, so this guard does not trigger —
Empty or absent output message No exception — Send returns void and SendResponse carries no body The caller captures nothing and cannot distinguish a partially delivered fax

Usage examples

// Called once per recipient from FaxService.SendFax
faxServiceProxy.SendFax(recipient, fullFilePath);
Scenario Operations used Notes
Hosted FaxService.SendFax fans out to N recipients Send Invoked once per FaxRecipient in config.Recipients; the foreach aborts on the first failure

Lifecycle guidance

Question Answer
Construct once or per call FaxServiceProxy is constructed once per FaxService instance and held in a readonly field; the underlying FaxServiceSoapClient is constructed once per FaxServiceProxy instance
Disposable Yes (IDisposable)
Safe to share across threads Not determined from source

Note: Statements marked with * were inferred from code structure, naming conventions, or contextual evidence where direct confirmation was not available in source artifacts.

Sources

  • src\WCF\SAIF.Services.WCF.Host\Services\LegacyProxies\FaxServiceProxy.cs
  • src\WCF\SAIF.Services.WCF.Host\Services\FaxService.cs
  • src\WCF\SAIF.Services.WCF.Host\Extensions\ErrorLogErrorHandler.cs
  • src\WCF\SAIF.Services.WCF.Host\Web.config