我正在使用非我公司制作的WCF服务。
我需要在代码中设置我的WCF(没有.config
文件修改)。
考虑到这一点,我试图在普通项目中使用Web.config
中的设置(由Add Service Reference
生成)来首先进行测试。它确实有效。
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IIntegracao" />
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://wcf.mydomain.com.br/Integracao.svc/Integracao.svc"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IIntegracao"
contract="ServiceReference1.IIntegracao" name="WSHttpBinding_IIntegracao">
<identity>
<userPrincipalName value="user@mydomain.com.br" />
</identity>
</endpoint>
</client>
</system.serviceModel>
我这样称呼它:
using (var client = new ServiceReference1.IntegracaoClient())
{
var resultado = client.Incluir(new Inclusao());
}
我继续执行任务,从Web.config
删除所有设置,但无法使其正常运行。
我甚至试图保持Web.config
不受影响,只需在客户端构造函数中通知它:
string url = ConfigurationManager.AppSettings["same url as above"];
var client2 = new IntegracaoClient(
"WSHttpBinding_IIntegracao",
new EndpointAddress(url));
var resultado2 = client2.Incluir(new Inclusao());
没用?
System.ServiceModel.Security.SecurityNegotiationException是 未处理的HResult = -2146233087消息= SOAP安全协商 用“http://wcf.mydomain.com.br/Integracao.svc/Integracao.svc”表示 目标 'http://wcf.mydomain.com.br/Integracao.svc/Integracao.svc' 失败。有关详细信息,请参阅内部异常。
InnerException:System.ComponentModel.Win32Exception 的HResult = -2147467259 消息=安全支持提供程序接口(SSPI)身份验证失败。服务器可能未在帐户中运行 身份'host / wcf.mydomain.com.br'。如果服务器正在运行 服务帐户(例如网络服务),指定帐户 ServicePrincipalName作为EndpointAddress中的标识 服务器。如果服务器在用户帐户中运行,请指定 account的UserPrincipalName作为EndpointAddress中的标识 服务器。 源= System.ServiceModel
我的问题是:第二个电话是否等同于第一个电话?
据我所知,第二个电话告诉客户端使用第一次调用中使用的相同配置。为什么第二次失败?
答案 0 :(得分:2)
不,它们不是等价的。在配置中,您将端点标识设置为某个用户,而不是代码。
ServiceEndpoint ep = myServiceHost.AddServiceEndpoint(
typeof(ICalculator),
new WSHttpBinding(),
String.Empty);
EndpointAddress myEndpointAdd = new EndpointAddress(new Uri("http://localhost:8088/calc"),
EndpointIdentity.CreateDnsIdentity("contoso.com"));
ep.Address = myEndpointAdd;
看看: https://msdn.microsoft.com/en-us/library/bb628618.aspx Programmatically set identity on WCF EndpointAddress
答案 1 :(得分:0)
在@Jocke
发布了组织答案后,我详细说明并找到解决方案。
就像他说配置在config
中有 Identity 但在代码中设置它时应该处理它的地址。
由于我无法找到与他所说的相同的构造函数,因此我需要进行一些更改以使其适合我的代码(框架4):
var endpoint = new EndpointAddress(
new Uri(ConfigurationManager.AppSettings["same url as above"]),
EndpointIdentity.CreateUpnIdentity("user@domain.com.br"),
(System.ServiceModel.Channels.AddressHeaderCollection)null);
var client3 = new ServiceReference1.IntegracaoClient(
new WSHttpBinding(),
endpoint);
最后一个构造函数参数cast null
只是为了向编译器说明我想要的重载。我使用了CreateUpnIdentity
代替。