Невозможно вызвать WCF WebService из DLL - PullRequest
1 голос
/ 07 ноября 2011

Я пытаюсь вызвать веб-службу WCF из созданной мною библиотеки DLL, работающей внутри нашего программного обеспечения САПР.Хотя я не могу заставить его работать.

Когда я пытаюсь установить мой прокси, я получаю следующую ошибку:

Не удалось найти элемент конечной точки с именем 'BasicHttpBinding_IAxaptaService' и contract 'AxaptaProxy.IAxaptaService 'в разделе конфигурации клиента ServiceModel.Это может быть связано с тем, что для вашего приложения не найден файл конфигурации, или из-за того, что в клиентском элементе не найден элемент конечной точки, соответствующий этому имени.

Я искал abit, и я предполагаю, что проблема заключается в том, чтоиз-за того, что моя DLL работает внутри другой программы.Было несколько статей о копировании конфигурации EndPoint из приложения в службу, но я не совсем понял, что я должен делать.

У кого-то есть идеи относительно того, как я могу сделать эту работу?

App.Config, созданный моим клиентом, выглядит так:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IAxaptaService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:4726/LM/AxaptaService.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IAxaptaService"
                contract="AxaptaProxy.IAxaptaService" name="BasicHttpBinding_IAxaptaService" />
        </client>
    </system.serviceModel>
</configuration>

Я попытался объединить это с моим web.config на сайте, на котором размещен веб-сервис,как это:

  <system.serviceModel>
    <bindings>
      <customBinding>
        <binding name="GetStream.customBinding0">
          <binaryMessageEncoding/>
          <httpTransport/>
        </binding>
      </customBinding>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IAxaptaService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
              maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None"
                realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="AutoCompletionAspNetAjaxBehavior">
          <enableWebScript/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
    <services>
      <service name="AutoCompletion">
        <endpoint address="" behaviorConfiguration="AutoCompletionAspNetAjaxBehavior" binding="webHttpBinding" contract="AutoCompletion"/>
      </service>
      <service name="GetStream">
        <endpoint address="" binding="customBinding" bindingConfiguration="GetStream.customBinding0" contract="GetStream"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <client>
      <endpoint address="http://localhost:4726/LM/AxaptaService.svc"
          binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IAxaptaService"
          contract="AxaptaProxy.IAxaptaService" name="BasicHttpBinding_IAxaptaService" />
    </client>
  </system.serviceModel>

Там уже есть пара других вещей.Я могу удалить их, если это облегчает.Я оставил их, если они как-то на это влияют.

Итак, я протестировал сервис из автономного приложения winform, и он отлично работает.Может ли это быть из-за App.config?Загружается ли мой конфиг для .dll?

Ответы [ 2 ]

3 голосов
/ 07 ноября 2011

Вам необходимо скопировать информацию о соединении из MyDll.dll.config в Web.config.

Будьте осторожны, чтобы объединить разделы конфигурации, а не просто добавлять новые данные бок о бок или заменять их. Если уже есть разделы с таким именем, вам, вероятно, придется их объединить.

Вот статья, описывающая внутренности частей WCF файла app.config:

http://msdn.microsoft.com/en-us/library/ms734663.aspx

Основные части:

<system.serviceModel>
   <bindings>
     <!-- various bindings go here... -->
   </bindings>
   <client>
     <!-- endpoints go here... -->
   </client>
</system.serviceModel>

Вам потребуется объединить все в этих узлах - добавьте различные типы элементов endpoint и binding в файл web.config вашего сервиса.

Итак, если у вас есть конфигурация, которая выглядит следующим образом:

<system.serviceModel>
   <bindings>
     <someBindingType name="someBinding" />
   </bindings>
   <client>
     <endPoint name="someEndpoint />
   </client>
</system.serviceModel>

Вам нужно будет скопировать элементы someBindingType и endPoint. Весь элемент, включая конечные теги (если они есть) и дочерние элементы.

Убедитесь, что вы не дублируете элементы system.serviceModel, bindings или client. Если они уже есть, объединяйтесь с ними, а не создавайте новые элементы / дублируйте.

1 голос
/ 07 ноября 2011

Я наконец заставил его работать!

Проблема заключалась в том, что app.config не загружался в моем проекте .dll.Чтобы исправить это, я создал привязку в коде, а не через app.config, как указано в этой теме: Конфигурация WCF без файла конфигурации

Спасибо за помощьхоть.Мерлин, без твоей помощи я бы даже не зашел так далеко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...