Перемещение конфигурации сервиса из конфига в код - PullRequest
0 голосов
/ 10 января 2019

В моем app.config есть следующая конфигурация:

<bindings>
  <customBinding>
    <binding name="myBinding">
      <textMessageEncoding messageVersion="Soap12"/>
      <httpTransport/>
    </binding>
  </customBinding>
  <wsHttpBinding>
    <binding name="myBinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8">
      <security mode="Transport">
        <transport clientCredentialType="Windows"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
<client>
  <endpoint address="/../" binding="wsHttpBinding" bindingConfiguration="myBinding" contract="myContract" name="myName"/>
</client>

При использовании этой конфигурации служба работает как положено.

По нескольким причинам я не могу использовать файл app.config в производственной среде, поэтому я хочу вместо этого определить привязки в c #. Я сделал следующее:

        var binding = new BasicHttpBinding();
        var address = new EndpointAddress(url);

        binding.Security = new BasicHttpSecurity() { Mode = BasicHttpSecurityMode.Transport };
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

        var client = new MyClient(binding, address);

Это работает для первой части, но затем не удается использовать неверную версию сообщения. Я вижу, что это определено в пользовательской привязке, но я не уверен, как перевести эту привязку в мой код. Я очень старался, но пока безрезультатно.

Кто-нибудь знает, как это сделать?

Ответы [ 4 ]

0 голосов
/ 16 января 2019

Попробуйте WebHttBinding:

binding = new WebHttpBinding
{
    TransferMode = TransferMode.Buffered,
    ReceiveTimeout = TimeSpan.FromMinutes(1),
    SendTimeout = TimeSpan.FromMinutes(1),
    MaxReceivedMessageSize = 2147483647,
    MaxBufferPoolSize = 2147483647,
    ReaderQuotas =
        {
            MaxDepth = 2147483647,
            MaxStringContentLength = 2147483647,
            MaxArrayLength = 2147483647,
            MaxBytesPerRead = 2147483647,
            MaxNameTableCharCount = 2147483647
        },
    Security = new WebHttpSecurity()
    {
        Mode = WebHttpSecurityMode.Transport,
        Transport = new HttpTransportSecurity()
        {
            ClientCredentialType = HttpClientCredentialType.Ntlm
        }
    }
};
0 голосов
/ 10 января 2019

Я бы порекомендовал вам использовать класс ConfigurationChannelFactory<TChannel> для настройки вашего клиента с использованием конфигурации XML из источника, отличного от файла app.config (например, строки XML, прочитанной из базы данных, из ресурса в вашем исполняемом файле или из другого пользовательского источника).

Формат XML ИМХО легче читать и поддерживать, чем конфигурация, построенная с использованием кода.

Для этого выполните следующие шаги:

  • Получить строку с вашими данными конфигурации XML, например ::

    string configurationData = @"<configuration>
        <system.serviceModel>
        ...
        ";
    
  • Сохранить во временный файл:

    var tempFileName = Path.GetTempFileName();
    File.WriteAllText(tempFileName, configurationData);
    
  • Создание объекта System.Configuration.Configuration из временного файла:

    var filemap = new ExeConfigurationFileMap
    {
        ExeConfigFilename = tempFileName
    };
    var config = ConfigurationManager.OpenMappedExeConfiguration(filemap, ConfigurationUserLevel.None);
    
  • Создать ChannelFactory<TChannel> из конфигурации:

    var channelFactory = new ConfigurationChannelFactory<TChannel>(endpointConfigurationName, config, remoteAddress);
    
  • После того как вы создали ChannelFactory<TChannel>, вы можете удалить временный файл.

0 голосов
/ 11 января 2019

Кажется, вы используете wshttpbinding. Вы можете попробовать код ниже. Пожалуйста, измените свой адрес и контракт.

  WSHttpBinding wsbinding = new WSHttpBinding();
        wsbinding.MaxBufferPoolSize = 2147483647;
        wsbinding.MaxReceivedMessageSize = 2147483647;
        wsbinding.MessageEncoding = WSMessageEncoding.Mtom;
        wsbinding.TextEncoding = Encoding.UTF8;
        wsbinding.Security.Mode = SecurityMode.Transport;
        wsbinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;

        using (ChannelFactory<ICalculatorService> channelFacoty = new ChannelFactory<ICalculatorService>(wsbinding, new EndpointAddress("http://localhost")))
        {
            ICalculatorService cal = channelFacoty.CreateChannel();
           Console.WriteLine( cal.Add(1, 3));
            Console.Read();
        }
0 голосов
/ 10 января 2019

Вы используете BasicHttpBinding вместо CustomBinding

вы должны сделать что-то вроде этого:

var binding = new CustomBinding();
TextMessageEncodingBindingElement textBindingElement = new TextMessageEncodingBindingElement
{
    MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None),
    WriteEncoding = System.Text.Encoding.UTF8,
    ReaderQuotas = System.Xml.XmlDictionaryReaderQuotas.Max
};
binding.Elements.Add(textBindingElement);

Но, если вы используете ядро ​​.net, у вас могут быть проблемы с этим, потому что существует открытая проблема для этого на GitHub: https://github.com/dotnet/wcf/issues/2711

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...