У меня есть служба 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 с олицетворением?Если нет, то какая лучшая альтернатива?