Относительный 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>