Не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт

Я знаю, что это было избито до смерти, но я не могу заставить это работать так, как должно. У меня есть служба WCF с несколькими контрактами. Все они работают нормально, когда вы вызываете их напрямую, например. http://merlin.com/CompanyServices/CompanyWcfService.svc/Get_Document_Dates_Received/223278 Я использовал эту службу WCF успешно в InfoPath Forms и Nintex Workflows. Теперь я создаю простое приложение ASP.Net, например, в http://www.webcodeexpert.com/2013/04/how-to-create-and-consume-wcf-services.html. Мне удалось добавить ссылку на службу, как описано в статье. Я добавил кнопку в форму и добавил следующий код в событии Button1_Click:

protected void Button1_Click(object sender, EventArgs e)
{
    ServiceReference1.CompanyWcfServiceClient x = new ServiceReference1.CompanyWcfServiceClient();
    var result = x.Get_Document_Dates_Received("223278");
}

когда я нажимаю на кнопку, я получаю сообщение об ошибке:

"Не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт ServiceReference1.ICompanyWcfService в разделе конфигурации клиента ServiceModel. Возможно, это связано с тем, что файл конфигурации не найден для вашего приложения или потому, что никакой элемент конечной точки, соответствующий этому контракту, не может быть найден в клиентский элемент."

Итак, я попытался добавить следующее к web.config: (скопировано непосредственно из файла web.config CompanyWcfService.

<system.serviceModel>
<services>
  <service name="CompanyWcfServices.CompanyWcfService" behaviorConfiguration="ServiceBehavior">
    <endpoint address="" binding="webHttpBinding" contract="CompanyWcfServices.ICompanyWcfService" behaviorConfiguration="webHttpEndpointBehavior" >
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange">                                                                
    </endpoint>
  </service>
</services>
<bindings>
  <webHttpBinding>
    <binding>
      <security mode="None">
      </security>
    </binding>
  </webHttpBinding>
</bindings>
<behaviors>
  <endpointBehaviors>
    <behavior name ="webHttpEndpointBehavior">
      <webHttp helpEnabled ="true" faultExceptionEnabled="true" automaticFormatSelectionEnabled="true"/>
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>

Я получаю ту же самую точную ошибку, должно быть что-то еще происходит.

Я, наконец, сдался и назвал эту услугу следующим образом:

HttpWebRequest request = WebRequest.Create(@"http://merlin/Companyservices/CompanyWcfService.svc/Get_Document_Dates_Received/223278") as HttpWebRequest;
request.Credentials = CredentialCache.DefaultCredentials;
HttpWebResponse response = null;

var result = "";
try
{
    response = request.GetResponse() as HttpWebResponse;
    if (response.StatusCode == HttpStatusCode.OK)
    {
        using (Stream stream = response.GetResponseStream())
        {
            StreamReader reader = new StreamReader(stream, Encoding.UTF8);
            result = reader.ReadToEnd();
        }
    }
}
catch (Exception ex)
{
    result = "";
}

Я потратил часы на чтение сообщений, и большинство из них предлагает скопировать конфигурационную информацию в файл web.config. Мне это кажется проблематичным (кроме того, что он не работает). Что делать, если мне нужно использовать стороннюю службу WCF? Должен ли я запрашивать информацию о конфигурации от третьего лица? И Visa Versa, если я создаю службу WCF, предназначенную для использования третьими лицами, мне нужно также предоставить им файл конфигурации?

Ответ 1

Ошибка указывает, что у вас нет конечной точки, определенной в разделе конфигурации клиента. Когда вы добавляете ссылку на службу в свой проект, она должна создать для вас раздел клиента. Если нет, то в web.config для вашего приложения в разделе system.serviceModel добавьте следующий

<client>
  <endpoint 
      name="CompanyWcfService_webhttpBinding"
      address="http://merlin.com/CompanyServices/CompanyWcfService.svc" 
      binding="webHttpBinding" 
      contract="CompanyWcfServices.ICompanyWcfService" 
      behaviorConfiguration="webHttpEndpointBehavior"
  />
</client>

Ответ 2

Если у нас есть многоуровневая архитектура, 1) добавить app.config в "все проекты" 2) Добавьте данные конфигурации службы во все app.config 3) запустить проект

Ответ 3

Если ваш проект ссылается на библиотеку и пытается использовать функции WCF из функций этой библиотеки, вы можете попробовать скопировать конечную точку клиента из файла конфигурации проекта в конфигурационный файл dll. Некоторая вещь, подобная этому, произошла со мной некоторое время назад, поскольку библиотека, на которую я ссылался в проекте, не будет использовать файл конфигурации проекта (в котором конечная точка клиента была настроена с момента ссылки на нее), но ее собственный, поэтому результат был система не смогла найти конфигурации конечных точек.

Ответ 4

В моем случае у меня был проект WPF, ссылающийся на внешний UserControl, который имел ссылку на службу. Мне также пришлось добавить ссылку на основной проект.

Ответ 5

Добавление значений привязки и клиента из app.config в default web.config разрешило мою проблему.

Ответ 6

На самом деле трюк к этому заключался в использовании svcutil.exe для создания прокси. Я пытался создать прокси-сервер с помощью Visual Studio "Добавить службу". Как только я это сделал, конфигурация была легким.

SvcUtil.exe