Относительный url в привязке службы wcf

У меня есть элемент управления silverlight, который имеет ссылку на службу wcf, включенную в Silverlight.

Когда я добавляю ссылку на службу в моем элементе управления silverlight, она добавляет следующее в файл clientconfig:

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_DataAccess" maxBufferSize="2147483647"
                    maxReceivedMessageSize="2147483647">
                    <security mode="None" />
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:3097/MyApp/DataAccess.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_DataAccess"
                contract="svcMyService.DataAccess" name="BasicHttpBinding_DataAccess" />
        </client>
    </system.serviceModel>
</configuration>

Как указать относительный URL-адрес в адресе конечной точки вместо абсолютного URL-адреса? Я хочу, чтобы он работал независимо от того, где я развертываю веб-приложение, без необходимости редактировать файл clientconfig, потому что компонент silverlight и веб-приложение всегда будут развернуты вместе. Я думал, что смогу указать только "DataAccess.svc", но, похоже, это не так.

Ответ 1

Вы не можете использовать относительные URI в конфигурации конечной точки клиента. Что вы можете сделать, просто добавьте еще один конструктор в свой прокси-класс, который возьмет какой-то параметр URL, который вы можете получить из другого значения конфигурации или использовать один из методов класса Dns.

Ответ 2

Мое решение:

Вместо того, чтобы использовать конструктор devault (который использует файл ServiceReferences.ClientConfig) для создания экземпляра моего прокси-класса, я использую следующее:

svcMyService.DataAccessClient svcProxy_m;

System.ServiceModel.BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();

/*
Create an end point, build a an absolute uri reference by specifing the host address and a relative referece to the service page.
Application.Current.Host.Source will be something like Http://server/app/ClientBin/SilverlightApp.xap"<br/><br/>
Specifying Uri(Application.Current.Host.Source, "../DataAccess.svc")); will return "Http://server/app/DataAccess.svc"
*/

System.ServiceModel.EndpointAddress address = new System.ServiceModel.EndpointAddress(new Uri(Application.Current.Host.Source, "../DataAccess.svc"));

svcProxy_m = new svcMyService.DataAccessClient(binding, address);

Ответ 3

Я использовал относительный uri в конфигурации, и мое приложение SL4 работает.

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_ICorrectionService" maxBufferSize="2147483647"
                    maxReceivedMessageSize="2147483647" textEncoding="utf-8" transferMode="Buffered">
                    <security mode="None" />
                </binding>
            </basicHttpBinding>
        </bindings>        
        <client>
            <endpoint address="/CorrectionService.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ICorrectionService"
            contract="CorrectionService.ICorrectionService" name="BasicHttpBinding_ICorrectionService" />
        </client>        
    </system.serviceModel>
</configuration>