这两个代码应该是等价的吗?以编程方式设置端点

时间:2015-03-25 18:00:36

标签: c# wcf

我正在使用非我公司制作的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

我的问题是:第二个电话是否等同于第一个电话?

据我所知,第二个电话告诉客户端使用第一次调用中使用的相同配置。为什么第二次失败?

2 个答案:

答案 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代替。