Использовать веб-сервис Java через C # Service Reference - PullRequest
1 голос
/ 01 марта 2011

Есть много вопросов о том, как сделать это, используя Web Reference в C #, но я знаю, как это сделать.То, что я пытаюсь сделать, - это иметь переносимый dll, который использует веб-службы Java, на которые я могу ссылаться в своих проектах, вместо дублирования функциональности.Одна из вещей заключается в том, что для веб-ссылок KeepAlive запроса устанавливается на true.Это не работает для среды, в которой я работаю, и должно быть false.Что я сделал с Web References, так это создал абстрактный класс, который наследовал SoapHttpClientProtocol, и изменил Reference.cs, чтобы он наследовал от абстрактного класса.Абстрактный класс выглядел так:

[System.Web.Services.WebServiceBinding(Name = "JavaWebReferenceProxy")]
public abstract class JavaWebReferenceProxy : SoapHttpClientProtocol
{
    public JavaWebReferenceProxy()
    {
        base.Timeout = Settings.Instance.SoapTimeout;
    }

    protected override WebRequest GetWebRequest(Uri uri)
    {
        WebRequest rq = base.GetWebRequest(uri);
        ((HttpWebRequest)rq).KeepAlive = Settings.Instance.SoapKeepAlive;

        return rq;
    }
}

Это позволило мне переопределить GetWebRequest и конструктор для установки значений, которые были в web.config.Мне интересно, как я могу сделать это с помощью ссылки на службу веб-службы Java.Я нашел несколько примеров для упрощенного раздела serviceModel в 4.0 (который я использую), но мне нужно также указать URL-адрес и время ожидания.Я не уверен, могу ли я использовать упрощенный serviceModel или мне нужно использовать полную реализацию.Я также не уверен, смогу ли я вообще использовать Справочник по обслуживанию.Я просто ищу небольшое руководство, если кто-нибудь реализовал что-то подобное.

Как должен выглядеть раздел serviceModel в моем конфигурационном файле?3 вещи, которые мне нужно уметь указать, это URL, время ожидания и поддержка активности.Заранее спасибо.

1 Ответ

2 голосов
/ 01 марта 2011

Для этого вам нужно пользовательское связывание.Попробуйте это:

<system.serviceModel>
  <bindings>
    <customBinding>
      <binding name="myBinding" sendTimout="00:05:00">
        <textMessageEncoding messageVersion="Soap11" />
        <httpTransport keepAliveEnabled="false" />
      </binding>
    </customBinding>
  </bindings>
  <client>
    <endpoint name="myEndpointName" address="http://..." binding="customBinding" 
              bindingConfiguration="myBinding" contract="MyReference.IMyService" />
  </client>
</system.serviceModel>

SendTimeout должен установить тайм-аут для завершения операции (включая получение ответа), keepAliveEnebled контролирует постоянное соединение HTTP, а адрес в edpoint является адресом службы.

...