Проблемы хостинга, настройки и адреса подключения к порту WCF (включая клиента Delphi 7) - PullRequest
2 голосов
/ 13 мая 2011

У меня есть служба WCF (MyWCFService) с базовым адресом

http://localhost:8732/Design_Time_Addresses/MyWCFService/Service1/

и следующим в app.config

  <system.serviceModel>
    <diagnostics performanceCounters="Default">
      <messageLogging logEntireMessage="true" logMalformedMessages="true"
        logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" />
    </diagnostics>
    <extensions>
      <behaviorExtensions>
        <add name="wsdlExtensions" type="WCFExtras.Wsdl.WsdlExtensionsConfig, WCFExtras, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      </behaviorExtensions>
    </extensions>
    <services>
      <service name="MyWCFService.Service1" behaviorConfiguration="MyWCFService.Service1Behavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/Design_Time_Addresses/MyWCFService/Service1/"   />
          </baseAddresses>
        </host>
        <!-- Service Endpoints -->
        <!-- Unless fully qualified, address is relative to base address supplied above -->
        <!--<endpoint address ="" binding="wsHttpBinding" contract="MyWCFService.IService1">
          --><!-- 
              Upon deployment, the following identity element should be removed or replaced to reflect the 
              identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity 
              automatically.
          --><!--
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>-->
        <!-- Metadata Endpoints -->
        <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. --> 
        <!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <endpoint address="" binding="basicHttpBinding" behaviorConfiguration="singleFileEndpointBehavior" contract="MyWCFService.IService1"/>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="singleFileEndpointBehavior">
          <wsdlExtensions singleFile="True" />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="MyWCFService.Service1Behavior">
          <!-- To avoid disclosing metadata information, 
          set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Этот MyWCFService размещен в приложении WinForms (WinFormsServiceHost)с базовым адресом

net.tcp://localhost:2202/Service1

и следующим кодом на WinForm

namespace MyWCFService
{
    public partial class Form1 : Form
    {
        bool serviceStarted = false;
        ServiceHost myServiceHost = null;
        Uri baseAddress = new Uri("net.tcp://localhost:2202/Service1");
        NetTcpBinding binding = new NetTcpBinding();
        public Form1() { InitializeComponent(); }

        private void StartService(object sender, EventArgs e)
        {
            if (!serviceStarted)
            {
                myServiceHost = new ServiceHost(typeof(Service1), baseAddress);
                myServiceHost.AddServiceEndpoint(typeof(IService1), binding, baseAddress);
                myServiceHost.Open();
                serviceStarted = true;
                RefreshServiceStatus(this, null);
            }
        }
        private void RefreshServiceStatus(object sender, EventArgs e) ...
        private void StopService(object sender, EventArgs e) ...
    }
}

Я тестирую этот сервис с тестовым клиентом WCF (WinFormsWCFTester), который использует

net.tcp://localhost:2202/Service1

и имеет следующий код на WinForm

namespace MyWCFService
{
    public partial class Form1 : Form
    {
        IService1 IService1 = null;
        public Form1() { InitializeComponent(); }

        private void Form1_Load(object sender, EventArgs e)
        {
            EndpointAddress address = new EndpointAddress(new Uri("net.tcp://localhost:2202/Service1"));
            NetTcpBinding binding = new NetTcpBinding();
            ChannelFactory<IService1> factory = new ChannelFactory<IService1>(binding, address);
            IService1 = factory.CreateChannel();
        }

        private void btnTest_Click(object sender, EventArgs e)
        {
            lblResponse.Text = IService1.GetData(txtSomeText.Text);
        }
    }
}

У меня также есть тестовый клиент Delphi 7 (Delphi7WCFTester), который использует адрес

http://localhost:8732/Design_Time_Addresses/MyWCFService/Service1/

Примечание: адрес исходит из сгенерированного WSDLДобавить ссылку на службу, когда мой WinFormsServiceHost работает.Я использую обновленный WSDL Importer для создания прокси-класса Pascal для Delphi 7.

Ситуация на моем ПК (даже странные вещи случаются, когда я перемещаю код на другой ПК или хуже - например, на виртуальную машину!)

Когда служба запущена (размещена на узле службы WCF - WcfSvcHost.exe, вызываемом VS2010), Webbrowser может перейти к

http://localhost:8732/Design_Time_Addresses/MyWCFService/Service1/

и telnet может подключиться к Localhost 8732. Мой клиент Delphi (Delphi7WCFTester)) может подключиться и работает должным образом, но мой клиент WCF (WinFormsWCFTester) не может подключиться (сообщение об исключении "Не удалось подключиться к net.tcp: // localhost: 2202 / Service1 ... Код ошибки TCP 10061 ... целевой компьютер активно отказался от него127.0.0.1:2202")

Когда служба размещается на моем WinFormsServiceHost и работает в отладчике Visual Studio, веб-браузер может перейти к http://localhost:8732/Design_Time_Addresses/MyWCFService/Service1/ и telnet может подключиться к и порты 8732 или 2202. Оба клиента (WinFormsWCFTester и Delphi7WCFTester) могут подключаться и работать должным образом.

Когда служба находится в хостеWinFormsServiceHost и работает независимо как exe (я использую Ctrl-F5 из VS2010), ни один адрес не может быть просмотрен с помощью Webbrowser.Telnet может подключаться к 2202, но не к 8732. Мой клиент WinFormsWCFTester подключается и работает правильно, но мой Delphi7WCFTester не может подключиться.

Мой вопрос

Как вы, вероятно, можете сказать из моего исчерпывающего описания моегоСитуация, я немного потерян.Мне нужно некоторое руководство, чтобы вернуть контроль над тем, что происходит.Оба клиента должны подключаться и работать правильно, независимо от того, как размещается службаЯ знаю, у меня есть чему поучиться.Я надеюсь, что кто-нибудь может привести меня в правильном направлении с помощью нескольких важных указателей.

1 Ответ

2 голосов
/ 13 мая 2011

Похоже, вы ожидаете, что одно клиентское приложение (Delphi или WinForm) подключится к различным экземплярам службы без изменения конфигурации клиента. У вас есть экземпляр службы WinForm, настроенный для netTcpBinding, и экземпляр MyWCFService, настроенный для basicHttpBinding. Клиент Delphi может подключаться только к экземпляру MyWCFService, поскольку оба они используют basicHttpBinding, а клиент WinForm может подключаться только к экземпляру WinForm, поскольку оба они используют netTcpBinding.

Чтобы добиться того, что, по вашему мнению, должно работать, вам нужно настроить оба экземпляра службы так, чтобы они выставляли конечные точки для и basicHttpBinding и netTcpBinding. Я никогда не пытался использовать basicHttpBinding в приложении WinForm, но думаю, что это должно сработать.

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