Невозможно использовать netNamedPipeBinding для службы WCF с олицетворением - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть служба WCF, размещенная как служба Windows, конечные точки которой будут вызываться приложением, работающим в IIS на той же машине.Документ https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/choosing-a-transport рекомендует нам использовать netNamedPipeBinding для моего сценария.Но проблема в том, что я хочу, чтобы моя служба WCF выполняла действия, выдавая себя за клиента, который не поддерживается для netNamedPipeBinding в соответствии с документом https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/using-impersonation-with-transport-security.. Также я не хочу использовать другой транспорт, такой как 'netTcpBinding' или 'basicHTTPBinding.«что требует от нас открытия порта сокета, который потенциально может конфликтовать с существующими процессами, работающими на том же порту, также существует вероятность того, что номер порта может быть заблокирован брандмауэром в среде клиента.Для netNamedPipeBinding не требуется номер порта.

Я попытался вызвать службу WCF с олицетворением, используя 'netNamedPipeBinding'.Но это всегда приводило к ошибке со следующей ошибкой: «Нет конечной точки, прослушивающей net.pipe: // localhost / MyService, которая могла бы принять сообщение.Это часто вызвано неправильным адресом или действием SOAP.См. InnerException, если имеется, для более подробной информации. '

Это пример конечной точки в моей службе WCF.

[OperationBehavior(Impersonation=ImpersonationOption.Required)]
public bool SampleEndpoint()
{
   // Do something
}

web.config моей службы WCF.

<system.serviceModel>
    <services>
      <service name="MyLibrary.MyService">
        <endpoint address="MyService" binding="netNamedPipeBinding" 
                  bindingConfiguration=""
                  contract="MyLibrary.IMyService" />
        <host>
          <baseAddresses>
            <add baseAddress="net.pipe://localhost/"/>
          </baseAddresses>
        </host>
      </service>
    </services>
</system.serviceModel>

Код клиента для олицетворения и вызоваСлужба WCF.

WindowsIdentity wid = (WindowsIdentity)(HttpContext.Current.User.Identity);
wid.Impersonate();

//Code to call the client

var client = new MyServiceClient();
client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
bool result = client.SampleEndpoint();

Есть ли способ использовать netNamedPipeBinding с олицетворением?Если нет, то какая лучшая альтернатива?

...