Конечные точки WCF сводят меня с ума - PullRequest
4 голосов
/ 22 октября 2010

Может быть, я просто не понимаю, но у меня есть служба, развернутая на машине IIS 6.У этой машины есть адрес локальной сети и общедоступный интернет-адрес.

Как же я могу публиковать эту службу с обоими доступными?

Сначала я подумал: ничего страшного, 2 конечных точки.Итак, у меня есть

<endpoint 
    address="Address 1" 
    binding="wsHttpBinding" 
    bindingConfiguration="DefaultBindingConfiguration" 
    name="RemoteEndpoint" />

<endpoint
    address="Address 2" 
    binding="wsHttpBinding" 
    bindingConfiguration="DefaultBindingConfiguration" 
    name="LocalEndpoint" />

Тогда код клиента выглядит следующим образом:

public void createServiceProxy()
{
    if (Util.IsOperatingLocally())
        this.proxy = new ProxyClient("LocalEndpoint");
    else
        this.proxy = new ProxyClient("RemoteEndpoint");
}

Без кубиков.Не могу добавить сервисную ссылку.

Нет привязки протокола к указанному адресу «Адрес 1».Привязки протокола настраиваются на уровне сайта в конфигурации IIS или WAS.

Тогда я подумал: может быть, поможет тег host и его тег dns.Нет, это для аутентификации.

Тогда я подумал: я буду использовать net.tcp для локальной конечной точки.Упс ... IIS 6 не поддерживает net.tcp.

Тогда я подумал: я знаю, конструктор ProxyClient принимает строку remoteAddress в качестве второго параметра.Теперь это будет выглядеть так:

<endpoint
    address="" 
    binding="wsHttpBinding" 
    bindingConfiguration="DefaultBindingConfiguration" 
    name="MyEndpointName" />

public void createServiceProxy()
{
    if (Util.IsOperatingLocally())
        this.proxy = new ProxyClient("MyEndpointName", "Address 1");
    else
        this.proxy = new ProxyClient("MyEndpointName", "Address 2");
}

Видимо, нет.При попытке создать экземпляр ProxyClient ...

Не удалось найти элемент конечной точки с именем 'MyEndpointName' и контрактом MyService.IService 'в разделе конфигурации клиента ServiceModel.

Это приводит меня к app.config, чей сгенерированный клиентский раздел выглядит следующим образом:

<client>
    <endpoint address="http://localhost:3471/Service.svc" binding="customBinding"
        bindingConfiguration="MyEndpointName" contract="MyService.IService"
        name="MyEndpointName">
        <identity>
            <userPrincipalName value="DevMachine\UserNa,e" />
        </identity>
    </endpoint>
</client>

Который, конечно, мне не подходит.

Моя следующая мысль не здорова.Пожалуйста, помогите.

Ответы [ 2 ]

4 голосов
/ 22 октября 2010

Вот что я делаю:

PortClient client = new PortClient(); // from the service reference

EndpointAddress endpointAddress;

if (local)
    endpointAddress = new EndpointAddress("http://local/Service.svc");
else
    endpointAddress = new EndpointAddress("http://remote/Service.svc");

client.ChannelFactory.CreateChannel(endpointAddress);
client.RemoteMethod();

и т. Д.

1 голос
/ 29 октября 2010

Вы действительно помещали строки "Address 1" и "Address 2" в файл конфигурации?

Фреймворк всегда анализирует адрес, чтобы узнать, какой транспорт использовать. например, "http://myurl" будет использовать http", net.pipe: // localhost / MyNamedPipeExample "будет использовать IPC.

Ошибка возникла из-за отсутствия префикса в строке «Адрес 1».

Полагаю, это сработало бы без необходимости жесткого кодирования адресов:

<endpoint 
    address="http://serverName/ServiceName/Service.svc" 
    binding="wsHttpBinding" 
    bindingConfiguration="DefaultBindingConfiguration" 
    name="RemoteEndpoint" />

<endpoint
    address="http://www.companyName.com/ServiceName/Service.svc" 
    binding="wsHttpBinding" 
    bindingConfiguration="DefaultBindingConfiguration" 
    name="LocalEndpoint" />
...