WCF - как создать программно настраиваемую привязку с двоичным кодированием по HTTP (S) - PullRequest
6 голосов
/ 10 февраля 2010

Я хотел бы преобразовать текущие настройки привязки HTTP / HTTPS WCF для использования двоичного кодирования сообщений, и мне нужно сделать это в коде, а не в конфигурации XML. AFAIK необходимо создать объект CustomBinding и установить надлежащие BindingElements, но я не могу понять, какие элементы мне следует использовать в моем сценарии.

Основные моменты в моей конфигурации WCF:

  • использовать транспорт HTTP или HTTPS в зависимости от конфигурации (в app.config)
  • использовать имя пользователя сообщения безопасности
  • todo: добавить двоичную кодировку вместо текста по умолчанию

Мой текущий код для настройки привязки (работает, но без двоичной кодировки):

var isHttps = Settings.Default.wcfServiceBaseAddress.StartsWith("https://", StringComparison.InvariantCultureIgnoreCase);
var binding = new WSHttpBinding(isHttps ? SecurityMode.TransportWithMessageCredential : SecurityMode.Message);
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;

Я пробовал этот код, но он не работает - я не знаю, как установить элемент защиты сообщения для безопасности имени пользователя:

var custBinding = new CustomBinding();
custBinding.Elements.Add(new BinaryMessageEncodingBindingElement());
//Transport Security (Not Required)
if (isHttps)
{
    custBinding.Elements.Add(SecurityBindingElement.CreateUserNameForSslBindingElement());
}
//Transport (Required)
custBinding.Elements.Add(isHttps ?
    new HttpsTransportBindingElement() :
    new HttpTransportBindingElement());

Кто-нибудь знает, как это настроить? Я пытался найти похожую проблему / решение, но безуспешно ...

Ответы [ 3 ]

7 голосов
/ 24 марта 2011

Я почти забыл этот вопрос, но вот мой пользовательский класс привязки, который работает с двоичной привязкой по HTTP с проверкой имени пользователя + пароля, а также позволяет включить сжатие GZip ...

    public class CustomHttpBinding: CustomBinding
{
    private readonly bool useHttps;
    private readonly bool useBinaryEncoding;
    private readonly bool useCompression;
    private readonly HttpTransportBindingElement transport;

    public CustomHttpBinding(bool useHttps, bool binaryEncoding = true, bool compressMessages = false)
    {
        this.useHttps = useHttps;
        transport = useHttps ? new HttpsTransportBindingElement() : new HttpTransportBindingElement();
        useBinaryEncoding = binaryEncoding;
        useCompression = compressMessages;
    }

    public long MaxMessageSize{set
    {
        transport.MaxReceivedMessageSize = value;
        transport.MaxBufferSize = (int) value;
    }}

    public override BindingElementCollection CreateBindingElements()
    {
        BindingElement security;
        if (useHttps)
        {
            security = SecurityBindingElement.CreateSecureConversationBindingElement(
                SecurityBindingElement.CreateUserNameOverTransportBindingElement());
        }
        else
        {
            security = SecurityBindingElement.CreateSecureConversationBindingElement(
                SecurityBindingElement.CreateUserNameForSslBindingElement(true));
        }

        MessageEncodingBindingElement encoding;
        if (useCompression)
        {
            encoding = new GZipMessageEncodingBindingElement(useBinaryEncoding
                                                                ? (MessageEncodingBindingElement)
                                                                  new BinaryMessageEncodingBindingElement()
                                                                : new TextMessageEncodingBindingElement());
        }
        else
        {
            encoding = useBinaryEncoding
                        ? (MessageEncodingBindingElement) new BinaryMessageEncodingBindingElement()
                        : new TextMessageEncodingBindingElement();
        }

        return new BindingElementCollection(new[]
            {
                security,
                encoding,
                transport,
            });
    }
}
0 голосов
/ 23 марта 2010

SecurityBindingElement имеет свойство AllowInsecureTransport. Если для этого параметра установлено значение true, вы можете использовать HttpTransportBindingElement с именем пользователя и паролем безопасности.

0 голосов
/ 12 февраля 2010

Попробуйте SecurityBindingElement.CreateUserNameOverTransportBindingElement() вместо:

var custBinding = new CustomBinding();
custBinding.Elements.Add(new BinaryMessageEncodingBindingElement());
//Transport Security (Not Required)
if (isHttps)
{
  custBinding.Elements.Add(SecurityBindingElement.CreateUserNameOverTransportBindingElement());
}
//Transport (Required)
custBinding.Elements.Add(isHttps ?
   new HttpsTransportBindingElement() :
   new HttpTransportBindingElement());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...