Подтвердить что ты не робот

Потребляйте веб-службу SOAP, не полагаясь на app.config

Я создаю компонент .NET, который вызовет внешний веб-сервис. Я использовал диалоговое окно "Добавить ссылку на службу", чтобы добавить веб-службу к моему компоненту, который генерирует код, необходимый для использования службы, и добавляет настройки в файл app.config.

Я тестирую компонент, добавляя ссылку на свою DLL из приложения Console и вызывая соответствующий метод, который создает новый экземпляр веб-службы: ... = new MyServiceSoapClient(). Однако, когда я это делаю, я получаю следующее исключение:

InvalidOperationException

Не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт "MyServicesSoap" в разделе конфигурации клиента ServiceModel. Возможно, это связано с тем, что файл конфигурации не найден для вашего приложения или потому, что элемент-конечный элемент, соответствующий этому контракту, не найден в клиентском элементе.

Это имеет смысл, поскольку app.config не переносится с помощью DLL-компонента. Как я могу вызвать веб-службу, не полагаясь на настройки в App.Config?

4b9b3361

Ответ 1

Настройки в <system.ServiceModel> в файле app.config сообщают компоненту, как подключиться к внешней веб-службе. Xml - это просто текстовое представление необходимых классов и перечислений, необходимых для подключения по умолчанию к веб-службе.

Например, это код, который был сгенерирован для веб-службы, которую я добавил:

<system.serviceModel>
 <bindings>
  <basicHttpBinding>
   <binding name="MyServicesSoap" closeTimeout="00:01:00" openTimeout="00:01:00"
     receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
     bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
     maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
     useDefaultWebProxy="true">
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
       maxBytesPerRead="4096" maxNameTableCharCount="16384" />
     <security mode="None">
      <transport clientCredentialType="None" proxyCredentialType="None"
        realm="" />
      <message clientCredentialType="UserName" algorithmSuite="Default" />
     </security>
    </binding>
   </basicHttpBinding>
  </bindings>
 <client>
  <endpoint address="http://services.mycompany.com/WebServices/MyServices.asmx"
    binding="basicHttpBinding" bindingConfiguration="MyServicesSoap"
    contract="MyServices.MyServicesSoap" name="MyServicesSoap" />
 </client>
</system.serviceModel>

Это можно перевести на код следующим образом:

    'Set up the binding element to match the app.config settings '
    Dim binding = New BasicHttpBinding()
    binding.Name = "MyServicesSoap"
    binding.CloseTimeout = TimeSpan.FromMinutes(1)
    binding.OpenTimeout = TimeSpan.FromMinutes(1)
    binding.ReceiveTimeout = TimeSpan.FromMinutes(10)
    binding.SendTimeout = TimeSpan.FromMinutes(1)
    binding.AllowCookies = False
    binding.BypassProxyOnLocal = False
    binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard
    binding.MaxBufferSize = 65536
    binding.MaxBufferPoolSize = 524288
    binding.MessageEncoding = WSMessageEncoding.Text
    binding.TextEncoding = System.Text.Encoding.UTF8
    binding.TransferMode = TransferMode.Buffered
    binding.UseDefaultWebProxy = True

    binding.ReaderQuotas.MaxDepth = 32
    binding.ReaderQuotas.MaxStringContentLength = 8192
    binding.ReaderQuotas.MaxArrayLength = 16384
    binding.ReaderQuotas.MaxBytesPerRead = 4096
    binding.ReaderQuotas.MaxNameTableCharCount = 16384

    binding.Security.Mode = BasicHttpSecurityMode.None
    binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None
    binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None
    binding.Security.Transport.Realm = ""
    binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName
    binding.Security.Message.AlgorithmSuite = Security.SecurityAlgorithmSuite.Default

    'Define the endpoint address'
    Dim endpointStr = "http://services.mycompany.com/WebServices/MyServices.asmx"
    Dim endpoint = New EndpointAddress(endpointStr)
    'Instantiate the SOAP client using the binding and endpoint'
    'that were defined above'
    Dim client = New MyServicesSoapClient(binding, endpoint)

Обычно, когда вы используете конструктор без параметров (т.е. new MyServicesSoapClient()), будут использоваться настройки в файле app.config. Однако вы можете обойти файл app.config, явно указывая значения binding и endpoint в коде и передавая эти экземпляры в конструктор.

Ответ 2

Если это служба WCF (которая звучит так, из сообщений об ошибках), то, по большей части, вам понадобится что-то app.config, потому что это app.config, который сообщает остальным WCF, что MyServiceSoapClient является веб-службой (с небольшим изменением на два файла app.config, это может стать именованным сервисом, без перекомпиляции кода....)

Теперь, если вы действительно хотите сделать это без app.config, тогда вам нужно бросить сгенерированный MyServiceSoapClient() и написать свой собственный, на основе HttpWebRequest.