---
title: Send a fax
summary: Send a fax with a file attachment through the Fax SOAP service.
status: draft
owner: SAIF.Core Documentation Team
last_reviewed: 2026-09-24
library: SAIF.Services.Web.Proxies
reference_type: package
operation_id: OP-WP-03
trigger: Services/SAIF.Services.WCF/Services/FaxService.cs (non-eligible), or package consumers
---

# Send a fax

`FaxServiceProxy.SendFax` wraps the Fax SOAP service (`FaxServiceSoapClient`) to send a file, identified only by its local path, to a fax recipient over a Windows-authenticated transport.

| Field | Value |
| --- | --- |
| **Operation ID** | OP-WP-03 |
| **Trigger** | `Services/SAIF.Services.WCF/Services/FaxService.cs:42` (non-eligible in this run), or package consumers |
| **Inputs** | `FaxRecipient message`, `string fullFilePath` |
| **Outputs** | None; the call is fire-and-forget |
| **Primary components** | `FaxServiceProxy.SendFax` |
| **Entry point** | `Services/SAIF.Services.Web.Proxies/FaxServiceProxy.cs` |

## Steps

1. Construct `FaxServiceProxy(serviceUrl)`: guard `serviceUrl` ([WP-BR-001](../business-rules.md#wp-br-001-required-arguments-must-be-non-null-or-non-empty)), then build `BasicHttpBinding(TransportCredentialOnly)` with `HttpClientCredentialType.Windows` and `int.MaxValue` quotas ([WP-BR-010](../business-rules.md#wp-br-010-fax-calls-use-windows-transport-credentials)).
2. **`SendFax(message, fullFilePath)`:**
   1. Build a wire `FaxInfo` with `Attachment = fullFilePath` (a file path, not file content), `ToFaxNumber = message.FaxNumber`, and `ToName = message.RecipientName`.
      - On failure: there is no null guard on `message`; CA1062 is suppressed, so a null `message` throws `NullReferenceException`.
   2. Call wire `Send(faxInfo)`. Nothing is returned; the operation is fire-and-forget.

## Process flow

The following diagram visualizes the fax send path.

```mermaid
flowchart TD
	Start([SendFax invoked]) --> Guard{"message not null?"}
	Guard -->|No| Fail([NullReferenceException])
	Guard -->|Yes| Build["Build wire FaxInfo<br>(Attachment = file path)"]
	Build --> Send["Call wire Send(faxInfo)"]
	Send --> Ret(["Return; no result"])
```

## Failure and edge-case behavior

- A null/empty `serviceUrl` at construction throws an argument exception before any wire client is created.
- A null `message` throws `NullReferenceException`, because the caller-supplied argument is not guarded (CA1062 suppressed).
- The remote fax service receives only a file **path**; the file's existence and readability at send time are the remote service's responsibility, not this wrapper's.

## Related documentation
- [Operations and processes](../operations-processes.md)
- [Business rules](../business-rules.md)

## Sources
- `Services/SAIF.Services.Web.Proxies/FaxServiceProxy.cs`
