我的团队正在开发一个相当大的应用程序,其中包含许多基于WCF NetTCP的服务。此系统将在其下运行的Windows服务不是本地帐户,而是标准域用户(在托管服务的服务器上具有管理员权限)。在测试连接的过程中,我遇到了SSPI调用失败的问题。基于几个小时的研究,这导致我错过了我的客户端配置中的以下行:
<identity>
<userPrincipalName value="MACHINE\user" />
</identity>
使用它的问题是我不使用VS或svcutil为此服务生成客户端/代理 - 正在使用的代理完全用代码编写,并且它们继承System.ServiceModel.ClientBase。我认为选择此选项的原因是我们可以使用完全相同的DataMember对象,这些对象通过栅栏两侧的服务 - 第三方组不需要连接到我们的服务,所以这不是问题
当我没有在标准system.serviceModel配置部分中指定端点时,有没有人知道我在客户端(代码或通过配置)设置userPrincipalName的方法?
以下是我的客户端web.config的参考资料:
<system.serviceModel>
<diagnostics>
<messageLogging logEntireMessage="true" logMalformedMessages="true"
logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" />
</diagnostics>
<behaviors>
<serviceBehaviors>
<behavior name="includeExceptions">
<serviceDebug includeExceptionDetailInFaults="true"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_Default" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="Infinite" sendTimeout="01:00:00" portSharingEnabled="true" transferMode="Buffered" maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
<security mode="Transport">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>
</security>
</binding>
</netTcpBinding>
</bindings>
</system.serviceModel>
答案 0 :(得分:6)
手动创建代理不会妨碍您将配置放在配置文件中;您只需要在ClientBase派生的代理类中公开正确的构造函数重载,该代理类委托给ClientBase中的right constructor,它将在配置中查找端点的名称。
也就是说,您当然可以通过代码填写端点标识,您只需要创建正确类型的EndpointIdentity派生类并将其附加到实例化代理类时使用的EndpointAddress对象。像这样:
EndpointIdentity epid = EndpointIdentity.CreateUpnIdentity("user@domain.fqdn");
EndpointAddress epaddr = new EndpointAddress(uri, epid);
MyClient client = new MyClient(epaddr);
答案 1 :(得分:1)
虽然我可能没有直接回答您的问题,但要在围栏的两侧使用相同的数据库,您不需要手动创建代理。你所做的是你使用svcutil生成你的代理并传入你的数据库的dll作为/ r
e.g
svcutil http://localhost/service/service.svc /r:AssemblyThatHasDataMembers.dll /out:ServiceProxy.cs
这样,ServiceProxy.cs文件中不会重复数据记录类型。您可以通过传递wsdl / xsd(真正的合同第一种方法),使用/ ct自定义集合类型等来广泛地进行自定义。
这将节省您手动制作代理的时间,同时避免您可能遇到的上述问题,因为一切都会成为股票标准。