【问题标题】:GeneXus 16 .NET Web - Consume SOAP service via External Object with Basic AuthenticationGeneXus 16 .NET Web - 通过具有基本身份验证的外部对象使用 SOAP 服务
【发布时间】:2020-05-28 23:35:47
【问题描述】:

我有一个消费者 (GX16 U5 .NET) 和一个提供者 (GX15 U6 Java) 正在通过 SOAP 进行通信。提供者期望具有基本身份验证的“授权”HTTP 标头,但我的消费者显然不包括标头(从 TCPTrace 中看到),即使我已将身份验证设置为是,身份验证方法设置为基本,并提供了凭据。

我正在使用从 WSDL 检查器创建的外部对象来使用服务,并相应地设置了 Location 变量。

在 .NET 端(甚至在 IIS 中)我需要做些什么来包含标头吗?

我有来自第三个 KB (GX16 U5 Java) 的第二个消费者,它使用这个 SAME EXACT Provider 就好了 - 包括 HTTP 标头。

任何帮助将不胜感激!

【问题讨论】:

    标签: genexus


    【解决方案1】:

    .NET 之所以在第一次尝试中不包含 Authorization 标头是因为它不是抢占式的。

    相反的行为,在某些情况下被认为不太安全,即在第一次请求时发送凭据。 (这称为抢先验证)

    如果提供程序在第一次尝试后返回 401 错误代码,.NET 将执行第二次尝试,其中将包含授权标头和凭据。 如果提供者返回不同的代码,则不会进行第二次尝试。我们相信这是您的情况。

    总结一下: 调用服务时,将完成以下操作: - 将在不发送凭据的情况下发出请求。 - 服务器使用以下类型的标头响应错误 401:授权:基本 dXNlcjpwYXNz。 - 执行第二个请求,现在使用凭据。授权标头与授权一起使用:基本 dXNlcjpwYXNz - 服务器对用户进行身份验证并使用 Http 代码 200 进行响应。

    解决方法: 为了发送 Authorization 标头,您可能需要通过为每个重要的服务包含特定过程并替换您的 ExternalObject 来使用 httpclient。

    您将在下面找到示例:

    事件'TestHTTP'

    &HTTPClient.Host = "本地主机"

    &HTTPClient.Port = 8089

    &HTTPClient.BaseURL = "/version8JavaEnvironment/servlet/"

    &HTTPClient.AddHeader("Content-type", "text/xml;charset=utf-8")

    &HTTPClient.AddHeader("SOAPAction", "version8action/ASERVICEPROVIDER.Execute")

    &HTTPClient.AddHeader("授权", "pppppppppppppppppppppppppp")

    &XMLWriter.OpenRequest(&HTTPClient)

    &XMLWriter.WriteStartDocument("utf-8", 0)

    &XMLWriter.WriteStartElement("SOAP-ENVEnvelope")

    &XMLWriter.WriteAttribute("xmlnsSOAP-ENV",http//schemas.xmlsoap.org/soap/envelope/")

    &XMLWriter.WriteAttribute("xmlnsxsd", "http//www.w3.org/2001/XMLSchema")

    &XMLWriter.WriteAttribute("xmlnsSOAP-ENC",http//schemas.xmlsoap.org/soap/encoding/")

    &XMLWriter.WriteAttribute("xmlnsxsi", "http//www.w3.org/2001/XMLSchema-instance")

    &XMLWriter.WriteStartElement("SOAP-ENVBody")

    &XMLWriter.WriteElement("ServiceProvider.Execute", "")

    &XMLWriter.WriteAttribute("xmlns", "version8")

    &XMLWriter.WriteEndElement()

    &XMLWriter.Close()

    &HTTPClient.Execute("POST", "targetResourceName")

    &longvarchar = &HTTPClient.ToString()

    结束事件

    【讨论】:

    • 就我而言,我从未见过发送 HTTP 标头的“第二次尝试”,所以我不确定这是我的情况。最后,如果我在配置 Location 变量时告诉它,我仍然认为 .NET 代码应该发送 Authorization HTTP 标头。我决定在双方都切换到 REST 并使用 HTTP 客户端。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多