Как настроить службу WCF с wsHttpBinding, размещенной на IIS и расходуемой через Интернет?

У меня нет опыта работы со службой WCF в целом (это моя первая попытка создания, настройки и использования службы WCF).

  1. Я создал службу WCF, протестировал ее с помощью клиента тестирования WCF (на компьютере разработчика) в " Visual Studio", и все заработало.
  2. Я разместил его в IIS на нашем сервере (не на компьютере разработчика), добавив его в пул приложений ASP.Net v4.0, протестировал его с приложением Windows Forms (с компьютера разработки), в котором я добавил ссылку на службу для размещенной службы WCF. и все работало.
  3. Я пробовал то же приложение (и application.config) с домашнего компьютера, и я получаю эту ошибку: "Служба не прошла проверку подлинности".

Я пытался "Google it" и большинство из них сказали, что ошибка вызвана компьютерами в другом Домене (что ожидается, потому что мой Домашний ПК и Сервер на работе даже не находятся в одной сети), но я предполагаю, что WCF является расходным материалом через Интернет или я предполагаю, что неправильно?

On Development PC, WCF Service address is redirected to Local IP of Server PC. I've also added REST/Web Service because I need to POST some data and it's consumable without any problems.

Я что-то упускаю?

Web.config:

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

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>

  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>

  <system.serviceModel>

    <services>
        <service name="TestWCF.TestServis">
            <endpoint address="TestWCF" binding="wsHttpBinding" contract="TestWCF.ITestServis" />
        </service>

        <service name="TestWCF.TestPushingServis">
            <endpoint address="" binding="webHttpBinding" contract="TestWCF.ITestPushingServis" behaviorConfiguration="web" />
        </service>
    </services>

    <behaviors>

      <serviceBehaviors>
        <behavior>
          <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="true"/>
        </behavior>     
      </serviceBehaviors>

      <endpointBehaviors>
        <behavior name="web">
            <webHttp />
        </behavior>
      </endpointBehaviors>

    </behaviors>

    <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>

Application.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_ITestServis"
                         maxReceivedMessageSize="2147483647" />
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://testdomain.com:12345/TestServis.svc/TestWCF"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ITestServis"
                contract="TestServisReference.ITestServis"
                name="WSHttpBinding_ITestServis">
                <identity>
                    <servicePrincipalName value="host/ServerName" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

1 ответ

Решение

Для wsHttpBinding вам может потребоваться установить учетные данные Windows (имя пользователя, пароль и домен Windows) с помощью свойства ClientCredentials.

yourClient.ClientCredentials.Windows.ClientCredential.UserName = "name"
yourClient.ClientCredentials.Windows.ClientCredential.Password = "password"
yourClient.ClientCredentials.Windows.ClientCredential.Domain = "domain"

Кроме того - вы можете попытаться установить режим безопасности на нет в вашей привязке:

<security mode="None" />

Надеюсь, поможет,

Pawel

Другие вопросы по тегам