Получение исключения при работе с несколькими конечными точками - PullRequest
0 голосов
/ 30 сентября 2010

Я пытался создать приложение WCF с несколькими конечными точками, но при доступе к нему с помощью клиента (консольного приложения) я получаю ниже исключения:

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

Что я сделал: Сторона обслуживания:

Код:

public interface IStockService1 {
    [OperationContract]
    string GetDataForSS1(int value); 
}

[ServiceContract]
public interface IStockService2 {
    [OperationContract]
    string GetDataForSS2(int value);   
}

[ServiceContract]
public interface IStockService:IStockService1,IStockService2 {
    [OperationContract]
    string GetDataForSS3(int value);   
}   

public class StockService : IStockService{
    public string GetDataForSS3(int value){
        return "SS3"+value.ToString();
    }

    public string GetDataForSS1(int value){
        return "SS1"+value.ToString();
    }

    public string GetDataForSS2(int value){
        return  "SS2"+ value.ToString();
    }
}

конфигурация:

<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="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>
      <services>
          <service name="MultipleEndpointsDemo.StockService">
              <host>
                  <baseAddresses>
                      <add baseAddress="http://localhost:1832/StockService.svc/"/>
                  </baseAddresses>
              </host>
              <endpoint name="StockServiceSS1" address="SS1" binding="basicHttpBinding" contract="MultipleEndpointsDemo.IStockService1"/>
              <endpoint name="StockServiceSS2" address="SS2" binding="basicHttpBinding" contract="MultipleEndpointsDemo.IStockService2"/>
              <endpoint name="StockService" address="all" binding="basicHttpBinding" contract="MultipleEndpointsDemo.IStockService"/>
      </service>

      </services>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

        }

Теперь, используя svcutil.exe, я создал один класс config и прокси-сервер, затем добавил один App.config в консоль клиента и скопировал, вставил содержимое этого файла (из svcutil) и попытался получить доступ к службе.

Код клиента:

StockServiceClient proxy = new StockServiceClient("SS2");
Console.WriteLine(proxy.GetDataForSS2(15));
Console.ReadKey();

конфигурация:

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="StockServiceSS1" 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>
                <binding name="StockServiceSS2" 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>
                <binding name="StockService" 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:1832/StockService.svc/SS1"
                binding="basicHttpBinding" bindingConfiguration="StockServiceSS1"
                contract="IStockService1" name="StockServiceSS1" />
            <endpoint address="http://localhost:1832/StockService.svc/SS2"
                binding="basicHttpBinding" bindingConfiguration="StockServiceSS2"
                contract="IStockService2" name="StockServiceSS2" />
            <endpoint address="http://localhost:1832/StockService.svc/all"
                binding="basicHttpBinding" bindingConfiguration="StockService"
                contract="IStockService" name="StockService" />
        </client>
    </system.serviceModel>
</configuration>

Я думаю, что способ объявления <baseaddress> неверен (в файле конфигурации службы)

<service name="MultipleEndpointsDemo.StockService">
  <host>
    <baseAddresses>
        <add baseAddress="http://localhost:1832/StockService.svc/"/>
    </baseAddresses>
  </host>
  <endpoint name="StockServiceSS1" address="SS1" binding="basicHttpBinding" contract="MultipleEndpointsDemo.IStockService1"/>
  <endpoint name="StockServiceSS2" address="SS2" binding="basicHttpBinding" contract="MultipleEndpointsDemo.IStockService2"/>
  <endpoint name="StockService" address="all" binding="basicHttpBinding" contract="MultipleEndpointsDemo.IStockService"/>
</service>

Любая подсказка, где я иду не так

РЕДАКТИРОВАТЬ: Не уверен, почему Nix удалил его ANS, я реализовал его предложения, и он работал.

1 Ответ

1 голос
/ 30 сентября 2010

Таким образом, помимо направления вас в неправильном направлении (извините) вы используете не того Клиента! В вашей конечной точке должен быть другой клиент с именем (или рядом с ним).

StockServiceSS2Client client = new StockServiceSS2Client();

И это будет работать как чемпион.

То, что происходило, было то, что вы указали и получили конечную точку с другим контрактом, отличным от того, что искал клиентский класс.

Извините за путаницу.

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