Использовать WCF без app.config - PullRequest
3 голосов
/ 04 марта 2011

Мне нужно использовать службу WCF из DLL, поэтому у меня нет файла конфигурации для чтения конфигураций привязок.

Мне очень тяжело заставить его работать. В конце, как очень простое решение, я добавляю ссылку на WCF и создаю ее экземпляр следующим образом:

        WSHttpBinding binding = new WSHttpBinding();
        EndpointAddress address = new EndpointAddress("http://myhost.net/Service.svc");

        ServiceReference.ServiceClient client = new ServiceReference.ServiceClient(binding, address);
        var result = client.Method1();

В localhost это просто работает. При попытке с другой машины я получаю эту ошибку:

The request for security token could not be satisfied because authentication failed.

На хосте IIS установлен на «Аноним», поэтому я думаю, он должен просто работать.

Любая помощь?

РЕДАКТИРОВАТЬ: файл конфигурации службы

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true"/>
  </system.web>
  <system.serviceModel>
    <services>
      <service name="Mai.MyPlanner.Service">
        <endpoint address="" binding="wsHttpBinding" contract="Mai.MyPlanner.IService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://MY_SERVICE"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>

          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

<connectionStrings>
  <!-- PROD -->

  <!-- TEST -->
</connectionStrings>

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

Ответы [ 3 ]

4 голосов
/ 04 марта 2011

Используйте этот код:

WSHttpBinding binding = new WSHttpBinding();
EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity("localhost");
EndpointAddress address = new EndpointAddress("http://myhost.net/Service.svc", identity);

ServiceReference.ServiceClient client = new ServiceReference.ServiceClient(binding, address);
var result = client.Method1();

Вам все равно нужно будет передать значение и адрес Dns в ваш метод, вызывающий этот код.Кроме того, этот тип конфигурации будет работать только в интрасети (в том же домене Windows), поскольку он по умолчанию использует безопасность сообщений и проверку подлинности Windows.

2 голосов
/ 04 марта 2011

Вместо этого используйте базовую привязку http, если вам не требуется защита.

0 голосов
/ 28 декабря 2018

Что делать, если у вас есть ServiceHost, который будет использовать ServiceEndpoint, как показано ниже:

// Шаг 3 Добавьте конечную точку службы.selfHost.AddServiceEndpoint (typeof (ICalculator), привязка, «CalculatorService»);

Как бы вы по-прежнему программно определяли элементы App.config, такие как:

<services>
  <service name="GettingStartedLib.CalculatorService">
    <host>
      <baseAddresses>
        <add baseAddress = "http://localhost:8000/GettingStarted/CalculatorService" />
      </baseAddresses>
    </host>
    <!-- Service Endpoints -->
    <!-- Unless fully qualified, address is relative to base address supplied above -->
    <endpoint address="" binding="wsHttpBinding" contract="GettingStartedLib.ICalculator">
      <!-- 
          Upon deployment, the following identity element should be removed or replaced to reflect the 
          identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity 
          automatically.
      -->
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
    <!-- Metadata Endpoints -->
    <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. --> 
    <!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  </service>
</services>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...