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