Я решил эту проблему, не используя сгенерированный заголовок WS-Security (при добавлении ссылки на службу) в конфигурации WCF, а закомментировав это и вместо этого позволив .NET сгенерировать сам заголовок, используя учетные данные клиента и указавРежим безопасности «TransportWithMessageCredential»:
client.ClientCredentials.UserName.UserName = "UserName";
client.ClientCredentials.UserName.Password = "Password";
<basicHttpBinding>
<binding name="Binding">
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="None" proxyCredentialType="None" realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
(Мы используем SSL, поэтому отсюда и этот параметр безопасности).
Закомментированный сгенерированный заголовок:
<client>
<endpoint ...>
<!--<headers>
<wsse:Security...>
</wsse:Security>
</headers>-->
</endpoint>
</client>
К сожалению, я не знаю достаточно WCF, чтобы захватить необработанный запрос / ответ мыла, чтобы сравнить разницу и понять, почему ClientCredentials не вызывает ошибку «не было понято», а сгенерированный заголовок -.
Каккроме в соответствии с документацией MSDN , если вы используете только «Транспорт», он не будет знать об использовании WS-Security: «Оставьте это свойство в значении по умолчанию, то есть System.ServiceModel.SecurityMode.Transportне использовать WS-Security. "