---
title: SAIF.Services.Web.Proxies operations and processes
summary: Business and technical operations supported by this library.
status: draft
owner: SAIF.Core Documentation Team
last_reviewed: 2026-09-24
library: SAIF.Services.Web.Proxies
reference_type: package
---

# SAIF.Services.Web.Proxies operations and processes

This page is the operation catalog and cross-operation hub for this library. Each operation's detailed, step-by-step logic lives in its own page under `operations/`. None of these operations executes SQL or touches a database table directly; where a wrapper resolves database connection strings remotely, this is noted in the operation detail page.

## Operation catalog

| Operation | Intent | Trigger | Inputs | Outputs | Rules |
| --- | --- | --- | --- | --- | --- |
| [Get Active Directory user data or access](operations/get-active-directory-user-data-or-access.md) | Retrieve a default printer, a cached access decision, or contact details for an AD user | A caller request (no in-repo caller) | `userId`, `role`, `useExternalDomain` | Printer name, boolean access decision, or a `Contact` | [WP-BR-001](business-rules.md#wp-br-001-required-arguments-must-be-non-null-or-non-empty), [WP-BR-002](business-rules.md#wp-br-002-access-check-selects-internal-or-external-cache), [WP-BR-003](business-rules.md#wp-br-003-null-ad-attributes-become-empty-strings) |
| [Document generation, preview, distribution and print](operations/document-generation-preview-distribution-and-print.md) | Preview, categorize, distribute, or print documents through the xPression Design document service | `SAIF.Services.Utilities.Documents.DocumentService`, or package consumers | Package/profile names, `DocumentGenerationConfig`, `MailMessage`, `FaxInfoClass`, `DeferredPrintConfig`, `PrintConfig` | PDF bytes, sorted category/package lists, or a distribution/print side effect | [WP-BR-004](business-rules.md#wp-br-004-document-calls-identify-as-xpression-design) through [WP-BR-009](business-rules.md#wp-br-009-doccenter-distribution-sends-fax-info-only-when-present) |
| [Send a fax](operations/send-a-fax.md) | Send a fax with a file attachment through the Fax SOAP service | `Services/SAIF.Services.WCF/Services/FaxService.cs` (non-eligible), or package consumers | `FaxRecipient`, `fullFilePath` | Fire-and-forget; nothing returned | [WP-BR-010](business-rules.md#wp-br-010-fax-calls-use-windows-transport-credentials) |
| [Log an exception remotely](operations/log-an-exception-remotely.md) | Forward exception details to the remote logging service | EnvironmentApi `SAIFExceptionLogger` (non-eligible), or package consumers | `ApplicationExceptionDetail` | Remote `WriteError` call | — |
| [Retrieve a cached PDF image](operations/retrieve-a-cached-pdf-image.md) | Retrieve a cached PDF page image, waiting for the server to render it if necessary | A caller request (no in-repo caller) | `imageSeqNum`, `maxWaitTimeInSeconds` | Image bytes | [WP-BR-011](business-rules.md#wp-br-011-pdf-image-retrieval-requests-immediate-caching-with-retry) |
| [Work-calendar date queries](operations/work-calendar-date-queries.md) | Answer first/last/next work-day and working-day questions for a given calendar | A caller request (no in-repo caller) | `DateTime`, `calendar` | Date or boolean result | — |
| [Resolve a database connection string](operations/resolve-a-database-connection-string.md) | Resolve an Oracle or SQL Server connection string from the legacy connect-info SOAP service | `Services/SAIF.Services.Common/DbConnectionService.cs` (non-eligible), or package consumers | `instance`, `userName`, optionally `server` | A connection string containing credentials | [WP-BR-012](business-rules.md#wp-br-012-connection-string-requests-carry-the-process-user-and-pool-code), [WP-BR-013](business-rules.md#wp-br-013-oracle-connection-strings-decode-the-zspecialchar-token) |
| [Produce a certified-mail label](operations/produce-a-certified-mail-label.md) | Produce a SimpleCertifiedMail certified label for document distribution or subpoenas | `SubpoenaLabelService`, `DocumentDeferredService` (through `ISimpleCertifiedMailServiceProxy`) | `CertifiedLabelData`, number of pages | A GIF label image, or a thrown exception | [WP-BR-014](business-rules.md#wp-br-014-simplecertifiedmail-credentials-default-from-configuration) through [WP-BR-019](business-rules.md#wp-br-019-label-mode-follows-the-caller-flag-or-isproduction) |
| [Compute driving distances](operations/compute-driving-distances.md) | Compute driving distance and time between one or more address pairs via the Google Distance Matrix API | `SubpoenaService` (through `IGoogleMapsApiServiceProxy`) | Origin and destination addresses | `DistanceResults`, a list of miles, or an error message | [WP-BR-020](business-rules.md#wp-br-020-google-maps-base-uri-and-api-key-come-from-configuration) through [WP-BR-025](business-rules.md#wp-br-025-pairwise-distance-queries-require-equal-counts) |

## Process flow diagram

The following diagram visualizes the shared wrapper construction and delegation pattern common to the eight SOAP-backed operations.

```mermaid
flowchart TD
	Start([Caller invokes a wrapper method]) --> Guard{"Required arguments<br>non-null/non-empty?"}
	Guard -->|No| Fail(["Argument exception<br>thrown"])
	Guard -->|Yes| Build["Construct binding and<br>EndpointAddress(serviceUrl)"]
	Build --> Wire["Delegate to generated<br>SOAP/WCF client operation"]
	Wire --> Map["Map wire response to<br>SAIF.Core contract type"]
	Map --> Return(["Return mapped result<br>or side effect"])
```

## Database interactions

This library performs no direct database access. [Resolve a database connection string](operations/resolve-a-database-connection-string.md) resolves Oracle/SQL Server connection strings *remotely* via the DbConnection SOAP service; the actual SQL execution, if any, happens in the caller that uses the returned connection string, outside this library.

## Failure and edge-case behavior
- A missing or empty required argument (service URL, `userId`, `package`/`xml`, `database`) throws an argument exception from `Enforce` before any wire call is made ([WP-BR-001](business-rules.md#wp-br-001-required-arguments-must-be-non-null-or-non-empty)).
- `SendFax` and `MapFaxMessage` throw `NullReferenceException` on a null `message`/`faxInfo` because neither has a null guard.
- `GetContact` throws `NullReferenceException` if the wire call returns a null `userInfo`.
- `PdfServiceProxy.GetImage` throws if the wire call returns a null result.
- A certified-mail label response with `StatusCode != 1` is logged via `ILogService.LogException` and raised as `SimpleCertifiedException` ([WP-BR-018](business-rules.md#wp-br-018-a-failed-label-response-is-logged-and-thrown)).
- More than 76 pages requested from `GetDefaultLabelData` throws `InvalidNumberOfPagesException` ([WP-BR-015](business-rules.md#wp-br-015-default-label-size-is-set-by-page-count)).
- `GoogleMapsApiServiceProxy` rethrows Google API/network failures as `new Exception(e.Message)`, which loses the original exception type and stack trace*; it also does not dispose the `WebResponse` or its stream*.
- A non-`"OK"` element status from the Google API sets `ErrorMessage` rather than throwing ([WP-BR-023](business-rules.md#wp-br-023-a-non-ok-element-status-sets-an-error-message-without-throwing)); a parse failure on a single element in a multi-address query contributes 0 miles rather than failing the whole request ([WP-BR-024](business-rules.md#wp-br-024-a-failing-element-contributes-zero-miles)).
- Mismatched origin/destination counts in `GetMilesBetweenMultipleAddresses` throw before any request is sent ([WP-BR-025](business-rules.md#wp-br-025-pairwise-distance-queries-require-equal-counts)).
- Every wrapper's `Dispose()` calls `Close()` without an `Abort()` fallback, so disposing a faulted channel can itself throw*.

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

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Configuration](configuration.md)
- [Business rules](business-rules.md)
- [API reference](api/index.md)

## Sources
- `Services/SAIF.Services.Web.Proxies/ActiveDirectoryServiceProxy.cs`
- `Services/SAIF.Services.Web.Proxies/DocumentServiceProxy.cs`
- `Services/SAIF.Services.Web.Proxies/FaxServiceProxy.cs`
- `Services/SAIF.Services.Web.Proxies/LoggingServiceProxy.cs`
- `Services/SAIF.Services.Web.Proxies/PDFServiceProxy.cs`
- `Services/SAIF.Services.Web.Proxies/WorkCalendarServiceProxy.cs`
- `Services/SAIF.Services.Web.Proxies/Legacy/DbConnectionsServiceProxy.cs`
- `Services/SAIF.Services.Web.Proxies/SimpleCertifiedMailServiceProxy.cs`
- `Services/SAIF.Services.Web.Proxies/GoogleMapsApiServiceProxy.cs`
