2015-01-05 4 views
1

У меня есть проблема с подключением к службе WCF с пользовательской конечной точкой.Адрес изменения WCF во время выполнения

У меня есть excel addin, который общается с базой данных через службу WCF. Я создал сервис, и все работает нормально. Служба WCF указана в ServiceReference моего проекта Excel addin.

Но теперь у меня есть возможность установить сервер, на котором запущена служба WCF. Поэтому я разрешаю пользователю вводить URI службы, и я пытаюсь создать ServiceClient со связыванием и EndpointAdrress. Но если я создаю ServiceClient с EndPointAddress сервера, то EndpointNotFoundException будет поднят, даже если адрес сервера будет таким же, как из ServiceReference.

Я думаю, что может возникнуть проблема в файлах app.config и web.config, но я не знаю, где.

App.Config (Excel Addin)

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_ICampaignService" /> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:58375/CampaignService.svc" 
      binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ICampaignService" 
      contract="CampaignDatabaseService.ICampaignService" name="BasicHttpBinding_ICampaignService" /> 
    </client> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name=""> 
       <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="false" /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
     multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

Web.Config (службы WCF)

<?xml version="1.0"?> 
<configuration> 
    <connectionStrings> 
<add name="CampaignDatabase" connectionString="Data Source=dev\sql14;Initial Catalog=TSQL2012;Integrated Security=True;User id=addin_test;Password=testpassword;"/> 
    </connectionStrings> 
    <appSettings> 
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
    </appSettings> 
    <system.web> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5"/> 
    </system.web> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
     <!-- To avoid disclosing metadata information, set the values below to false before deployment --> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="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="false"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<protocolMapping> 
    <add binding="basicHttpBinding" scheme="http" /> 
</protocolMapping>  
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    <!-- 
    To browse web app root directory during debugging, set the value below to true. 
    Set to false before deployment to avoid disclosing web app folder information. 
    --> 
    <directoryBrowse enabled="true"/> 
</system.webServer> 

</configuration> 

И это, как я создаю ServiceClient

EndpointAddress serviceAddress = new EndpointAddress(Properties.Settings.Default.serviceAddress); 
BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None); 
CampaignServiceClient connector = new CampaignServiceClient(binding,serviceAddress); 

Благодарим Вас за мнения

+0

Просьба также показать фактический код, который вы используете для динамического привязки к новой конечной точке. –

+0

Вы пытаетесь запустить это на своей машине разработки или на машине пользователя? Вызов службы на локальном хосте будет только найти службу, если она работает на том же компьютере, что и надстройка. – dbugger

+0

Прямо сейчас, я только отлаживаю это решение в Visual Studio. Но основная идея заключается в том, что служба WCF может быть установлена ​​на разных компьютерах, а пользователь в Excel addin может ввести адрес сервера, на котором работает служба. И addin будет использовать этот адрес для подключения к службе WCF. –

ответ

0

Если я хотите изменить адрес во время выполнения. Я буду использовать channelFactory вместо сгенерированного serviceClient. Создана одна выборка из web.config, и это нехорошо меняться во время выполнения.

Нечто подобное. Перейдите к реальным настройкам.

//define binding 
BasicHttpBinding myBinding = new BasicHttpBinding(); 

//define endpoint url (where service is deployed) 
EndpointAddress myEndpoint = new EndpointAddress("http://localhost:58375/CampaignService.svc"); //change to real endpoint 

//Use channel factory instead of generated one 
ChannelFactory<ICampaignService> myChannelFactory = new ChannelFactory<ICampaignService>(myBinding, myEndpoint); //Change to you WCF interface 
ICampaignService myServiceClient = myChannelFactory.CreateChannel(); 

//and call it    
var result = myServiceClient.Add(1,1); //input to your method 
//other methods 

((IClientChannel)myServiceClient).Close(); 
myChannelFactory.Close(); 
+0

У меня такая же ошибка, когда я отлаживал ее в Visual Studio. Нет проблем с запуском службы на localhost? –