C # Как обновить привязку Visual Studio 2107 xxx.exe.config во время выполнения? - PullRequest
0 голосов
/ 28 мая 2018

Файл xxx.exe.config создается при компиляции кода веб-службы C #.Однако я хочу изменить одну из привязок во время выполнения.Пример файла xxx.exe.config, сгенерированного Visual Studio:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_ContentService"
                         messageEncoding="Mtom" />
            </basicHttpBinding>
        </bindings>
    </system.serviceModel>
</configuration>

Я хочу добавить некоторые параметры во время выполнения к привязке с именем «BasicHttpBinding_ContentService», которые эквивалентны кодированию вручную:

<binding name="BasicHttpBinding_ContentService"                             
              messageEncoding="Mtom"
              maxBufferSize="5000000"
              maxBufferPoolSize="524288"
              maxReceivedMessageSize="2147483648"
              transferMode="Streamed" />

Я думаю, что код C # для определения настроек параметров выглядит следующим образом:

using System.ServiceModel;

BasicHttpBinding myBinding = new BasicHttpBinding("BasicHttpBinding_ContentService");
myBinding.MaxBufferSize = 5000000;
myBinding.MaxBufferPoolSize = 524288;
myBinding.MaxReceivedMessageSize = 2147483648;
myBinding.TransferMode = TransferMode.Streamed;

Но я не могу найти пример C # (который работает), который применяет myBinding к моему VisualСтудия .config файл.В примерах я нахожу справочные классы, такие как ServiceHost и ServiceClient, которые в моей среде не определены.

Примечание. Я использую .NET 4.6.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

попробуй что-нибудь подобное и дай мне знать ...

NTEGRAWSSOAPClient _wsProtheus = null; // NTEGRAWSSOAPClient is a SOAP client class generated by vs2017 on register webservice

var endpointConfiguration = NTEGRAWSSOAPClient.EndpointConfiguration.INTEGRAWSSOAP; //INTEGRAWSSOAP is a ConfigurationName of service

_wsProtheus = new NTEGRAWSSOAPClient(endpointConfiguration,new EndpointAddress("http://new address?wsdl", new SpnEndpointIdentity("your identi")));

BasicHttpBinding bind = (BasicHttpBinding)_wsProtheus.Endpoint.Binding;

bind.CloseTimeout = TimeSpan.Parse("02:00:00");
bind.OpenTimeout = TimeSpan.Parse("02:00:00");
bind.ReceiveTimeout = TimeSpan.Parse("02:00:00");
bind.SendTimeout = TimeSpan.Parse("02:00:00");
bind.MaxBufferPoolSize = Int32.MaxValue;
bind.MaxBufferSize = Int32.MaxValue;
bind.MaxReceivedMessageSize = Int32.MaxValue;

bind.ReaderQuotas.MaxDepth = 32;
bind.ReaderQuotas.MaxStringContentLength = Int32.MaxValue;
bind.ReaderQuotas.MaxArrayLength = Int32.MaxValue;
bind.ReaderQuotas.MaxBytesPerRead = Int32.MaxValue;
bind.ReaderQuotas.MaxNameTableCharCount = Int32.MaxValue;

bind.Security.Mode = BasicHttpSecurityMode.None;
0 голосов
/ 28 мая 2018

Я изменяю довольно много конечной точки сервиса на лету, но никогда не использую конфиг.Я связываю веб-ссылку один раз, затем называю ее кодом, чтобы я мог изменять свойства на лету.Вот очень компактный пример, показывающий, что на самом деле работает

var binding = new BasicHttpBinding();
binding.CloseTimeout = new TimeSpan(0, 1, 30);
binding.OpenTimeout = new TimeSpan(0, 1, 30);
binding.ReceiveTimeout = new TimeSpan(0, 1, 30);
binding.SendTimeout = new TimeSpan(0, 1, 30);
binding.MaxReceivedMessageSize = 100000000;
binding.ReaderQuotas.MaxDepth = 2147483647;
binding.ReaderQuotas.MaxStringContentLength = 2147483647;
binding.ReaderQuotas.MaxArrayLength = 2147483647;
binding.ReaderQuotas.MaxBytesPerRead = 2147483647;
binding.ReaderQuotas.MaxNameTableCharCount = 2147483647;

var endpoint = new EndpointAddress("http:\\example.com\MyService\Service.svc");

// MyService is the service object name that is in the web reference
var svc = new MyService.Service(binding, endpoint);

var clientData = svc.GetClientData("SomeClientName");
...