Как настроить службу WCF с wsHttpBinding, размещенным в IIS и потребляемым через Интернет?

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

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

Я пытался "погуглить", и большинство из них сказали, что ошибка вызвана компьютерами в другом домене (что ожидается, потому что мой домашний компьютер и рабочий сервер даже не находятся в одной сети), но я предполагаю, что 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>

person Djiber    schedule 11.05.2015    source источник


Ответы (1)


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

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

Также - вы можете попытаться установить для режима безопасности значение none в своей привязке:

<security mode="None" />

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

Павел

person Pawel Wrobel    schedule 11.05.2015
comment
Я пробовал добавить: <bindings> <wsHttpBinding> <binding name="wsHttpBinding"> <security mode="None" /> </binding> </wsHttpBinding> </bindings> и: bindingConfiguration="wsHttpBinding" в конечную точку, но затем я получаю: безопасный канал не может быть открыт, потому что согласование безопасности с удаленной конечной точкой не удалось. Это может быть связано с отсутствием или неправильным указанием EndpointIdentity в EndpointAddress, используемом для создания канала. Убедитесь, что EndpointIdentity, указанный или подразумеваемый EndpointAddress, правильно определяет удаленную конечную точку. - person Djiber; 11.05.2015
comment
Также я предполагаю, что вы имели в виду: client.ClientCredentials.UserName.UserName = username; client.ClientCredentials.UserName.Password = пароль; У моего клиента нет client.ClientCredentials.Domain или client.ClientCredentials.UserName.Domain. Но я не заметил, что он проверяет предоставленные учетные данные, потому что я ввел случайную информацию, и она прошла на моем компьютере разработки, но такая же ошибка возникает на моем домашнем ПК. - person Djiber; 11.05.2015
comment
Извините, я неправильно набрал свой ответ. Я имел в виду: ClientCredentials.Windows.ClientCredential.UserName. Отредактирую свой ответ. - person Pawel Wrobel; 11.05.2015
comment
Кажется, что он работает (я пытался настроить его на своем домашнем ПК и протестировать с сервера и ПК для разработки, потому что у меня нет прав на управление учетными записями на работе, и теперь я получаю другую ошибку, но кажется Аутентификация прошла). Мне нужно подождать, пока наша администрация одобрит пользователя, чтобы я мог его протестировать. Спасибо за ваше время, помощь, информацию и терпение. - person Djiber; 12.05.2015