«Проблема» в том, что вы используете wsDualHttpBinding, предназначенный для дуплексных контрактов (сервер перезванивает клиенту). Вам нужен этот функционал? Если вы это сделаете, вам нужно будет предоставить ему адрес для прослушивания клиентом, указав clientBaseAddress
в вашей конфигурации привязки. Кроме того, вам необходимо указать конечной точке использовать конфигурацию привязки PoBindings1.
WCF автоматически добавит GUID к базовому адресу, чтобы гарантировать, что он генерирует уникальный адрес конечной точки, но, конечно, ему нужен номер порта, который он может прослушивать. См. эту страницу MSDN для документации раздела конфигурации. Это должно выглядеть примерно так:
<system.serviceModel>
<!-- client section omitted -->
<bindings>
<wsDualHttpBinding>
<binding name="PoBindings1"
clientBaseAddress="http://localhost:8080/Callbacks/">
<!-- extra config elements and attributes omitted -->
</binding>
</wsDualHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="DataAccessLayer.POEngineBehavior"
name="DataAccessLayer.POEngine">
<endpoint address=""
binding="wsDualHttpBinding"
bindingConfiguration="PoBindings1"
name="PoBindings" contract="DataAccessLayer.IPOEngine">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/Design_Time_Addresses/DataAccessLayer/POEngine/" />
</baseAddresses>
</host>
</service>
</services>
<!-- behaviors omitted -->
</system.serviceModel>
Вот как обычно выглядит сервисный контракт, если вы используете дуплексные контракты:
[ServiceContract(CallbackContract = typeof(IMyCallbackContract))]
interface IMyContract
{
[OperationContract]
void DoSomething();
}
interface IMyCallbackContract
{
[OperationContract]
void OnCallback();
}
Если вам не нужны функции обратного вызова, вы должны использовать WSHttpBinding или одну из других «простых» привязок. Вот список типов привязки, которые поставляются с WCF.