Служба WCF Selfhosting и basicHttpBinding: идентификатор Windows, представляющий вызывающего, не предоставляется привязкой

У меня есть собственный хостинг службы wcf в консольном приложении. Простой сервис самостоятельного хостинга не проблема, примеров достаточно.

Теперь я хочу выдать себя за абонента службы wcf. Хотя я следовал этой статье MSDN http://msdn.microsoft.com/en-us/library/ff648505.aspx я получаю следующую ошибку:

Операция контракта "GetProduct" требует идентификации Windows для автоматического олицетворения. Идентификатор Windows, который представляет вызывающего, не предоставляется привязкой

Вот мой App.config службы wcf в приложении CONSOLE:

    <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="SelfHostingWCFService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <applicationSettings>
    <SelfHostingWCFService.Properties.Settings>
      <setting name="URL" serializeAs="String">
        <value>http://localhost:8081/ProductService</value>
      </setting>
    </SelfHostingWCFService.Properties.Settings>
  </applicationSettings>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ProductServiceBehavior">
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceAuthorization impersonateCallerForAllOperations="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="SelfHostingWCFService.ProductService"
                behaviorConfiguration="ProductServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8081/ProductService"/>
          </baseAddresses>
        </host>
        <endpoint address="soap" binding="basicHttpBinding" contract="SelfHostingWCFService.IProductService"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
  </system.serviceModel>
</configuration>

Вот код обслуживания:

    public class ProductService : IProductService
{
     [OperationBehavior(Impersonation = ImpersonationOption.Required)]
    public Product GetProduct(int productId)
    {
        Product prod = new Product();
        prod.ID = productId;
        prod.Name = productId.ToString() + " XDS";

        return prod;
    }

     [OperationBehavior(Impersonation = ImpersonationOption.Required)]
    public string User()
    {
        string Name = string.Empty; 

        if (OperationContext.Current.ServiceSecurityContext != null)
            Name = OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name;

        if (ServiceSecurityContext.Current != null)
            Name = ";" + ServiceSecurityContext.Current.WindowsIdentity.Name;

        Name = ";" + Thread.CurrentPrincipal.Identity.Name;

        return Name;
    }
}

Вот код клиента:

    private void button1_Click(object sender, EventArgs e)
    {
        ProductService.ProductService srv = new ProductService.ProductService();

        //srv.Credentials = System.Net.CredentialCache.DefaultCredentials;
        ProductService.Product prod = srv.GetProduct(1, true);
        label1.Text = prod.Name;
        label2.Text = srv.User();

    }

Что я делаю не так? Пожалуйста, дайте мне знать.

Могу ли я использовать basicHTTPBinding или я должен использовать wsHTTPBinding?

большое спасибо за вашу помощь

1 ответ

Решение

Я не вижу вашей клиентской конфигурации - вам может потребоваться установить привязку вашего клиента Security.Transport.ClientCredentialType

Смотрите здесь: http://msdn.microsoft.com/en-us/library/ms729700%28v=vs.110%29.aspx

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