当前位置: 首页 > 知识库问答 >
问题:

如何将标题添加到VB。NET2008SOAP请求?

樊宏义
2023-03-14

我有一个VB。NET 2008程序,该程序使用SOAP协议访问由WSDL定义的Siebel web服务。

Siebel web服务要求包含用户名、密码和会话类型的头包含在服务请求中,但该头未在WSDL中定义。

因此,当我使用soapUI实用工具测试WSDL时,WSDL定义的请求如下所示:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:lov="http://www.siebel.com/xml/LOVService" xmlns:lis="http://www.siebel.com/xml/ListQuery">
<soapenv:Header/>
   <soapenv:Body>
      <lov:EAILOVGetListOfValues_Input>
         <lis:ListsQuery>
            <lis:ListQuery>
               <lis:Active>Y</lis:Active>
               <lis:LanguageCode>ENU</lis:LanguageCode>
               <lis:Type>CUT_ACCOUNT_TYPE</lis:Type>
            </lis:ListQuery>
         </lis:ListsQuery>
      </lov:EAILOVGetListOfValues_Input>
   </soapenv:Body>
</soapenv:Envelope>

但上述方法不起作用,因为它包含一个缺少用户和会话凭据的空头。仅当我手动替换

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:lov="http://www.siebel.com/xml/LOVService" xmlns:lis="http://www.siebel.com/xml/ListQuery">
<soapenv:Header>
  <UsernameToken xmlns="http://siebel.com/webservices">TESTUSER</UsernameToken>
  <PasswordText xmlns="http://siebel.com/webservices">TESTPASSWORD</PasswordText>
  <SessionType xmlns="http://siebel.com/webservices">None</SessionType>
</soapenv:Header>
   <soapenv:Body>
      <lov:EAILOVGetListOfValues_Input>
         <lis:ListsQuery>
            <lis:ListQuery>
               <lis:Active>Y</lis:Active>
               <lis:LanguageCode>ENU</lis:LanguageCode>
               <lis:Type>CUT_ACCOUNT_TYPE</lis:Type>
            </lis:ListQuery>
         </lis:ListsQuery>
      </lov:EAILOVGetListOfValues_Input>
   </soapenv:Body>
</soapenv:Envelope>

我的问题是,我无法理清如何将上述内容翻译成VB。NET 2008代码。

我可以将WSDL导入VisualStudio2008,在VB代码中定义服务并引用web服务方法。但是,我无法确定如何在VB中定义web服务,以便在web服务请求中包含更新的头,而不是空头。因此,我所有来自VB的服务请求都失败了。

我可以定义一个从SoapHeader类继承的类。。。

Public Class MySoapHeader : Inherits System.Web.Services.Protocols.SoapHeader
    Public Username As String
    Public Password As String
    Public SessionType As String
End Class

...但是我如何在VB发出的SOAP请求中包含这个头呢?

我用来测试的示例代码是一个带有按钮和列表框的简单表单。

Public Class Form1

    Private Sub btnGetLOV_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetLOV.Click

        Dim MyService As New wsLOV.EAILOVPortClient

        Dim MyInput As New wsLOV.EAILOVGetListOfValues_Input
        Dim MyParams(0) As wsLOV.ListQuery
        Dim temp As New wsLOV.ListQuery

        Dim MyResult As New wsLOV.EAILOVGetListOfValues_Output

        temp.Active = "Y"
        temp.Type = "CUT_ACCOUNT_TYPE"
        temp.LanguageCode = "ENU"
        MyParams(0) = temp

        MyInput.ListsQuery = MyParams

        Dim MyRequest As New wsLOV.EAILOVGetListOfValuesRequest(MyInput)
        MyResult = MyService.EAILOVGetListOfValues(MyInput)


    End Sub

End Class

该代码在子例程的最后一行失败,并显示一条消息,指示请求尚未通过身份验证(错误代码:10944642错误消息:错误:入站SOAP消息-会话令牌丢失或无效或已过期),这与我在soapUI中退出包含用户名、密码、密码的标头时遇到的错误相同,和会话类型。

我相信我需要将标头添加到endpoint(http://msdn.microsoft.com/en-us/library/ms731749.aspx和http://msdn.microsoft.com/en-us/library/system.servicemodel.configuration.serviceendpointelement.aspx),但我不确定如何在VB中执行此操作。


共有1个答案

轩辕海
2023-03-14

我们是这样解决这个问题的。关键似乎是使用附加标头实例化终结点,而不是在终结点已经实例化后尝试添加标头。

Imports System.ServiceModel.Channels
Imports System.ServiceModel

Public Class Form1

    Private Sub btnGetOrg_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetOrgType.Click
        ' This example code queries the Siebel web service using the SOAP protocol for a list of
        ' Account (organization) types stored in a List of Values (LOV). The service request
        ' requires that a SOAP header be added that contains the username, password, and session
        ' type. We have to add this header because the WSDL file definition generated by Siebel
        ' does not include the header definition. The WSDL file was added to the VS2008 project as
        ' a Service Reference named "wsGetLOV"

        ' Create address headers for special services and add them to an array
        Dim addressHeader1 As AddressHeader = AddressHeader.CreateAddressHeader("UsernameToken", "http://siebel.com/webservices", "TESTUSER")
        Dim addressHeader2 As AddressHeader = AddressHeader.CreateAddressHeader("PasswordText", "http://siebel.com/webservices", "TESTPASSWORD")
        Dim addressHeader3 As AddressHeader = AddressHeader.CreateAddressHeader("SessionType", "http://siebel.com/webservices", "None")
        Dim addressHeaders() As AddressHeader = {addressHeader1, addressHeader2, addressHeader3}

        ' Endpoint address constructor with URI and address headers
        ' Replace <servername> in the following line with the name of your Siebel server.
        ' For example: http://actual-server/eai_enu...
        Dim endpointAddressWithHeaders As New EndpointAddress(New Uri("http://<servername>/eai_enu/start.swe?SWEExtSource=WebService&SWEExtCmd=Execute&WSSOAP=1"), addressHeaders)
        Dim MyService As New wsGetLOV.EAILOVPortClient("EAILOVPort", endpointAddressWithHeaders)

        Dim MyInput As New wsGetLOV.EAILOVGetListOfValues_Input
        Dim MyOutput As wsGetLOV.EAILOVGetListOfValues_Output
        Dim MyList(0) As wsGetLOV.ListQuery

        MyList(0) = New wsGetLOV.ListQuery
        MyList(0).Active = "Y"
        MyList(0).LanguageCode = "ENU"
        MyList(0).Type = "CUT_ACCOUNT_TYPE"
        MyInput.ListsQuery = MyList

        MyOutput = MyService.EAILOVGetListOfValues(MyInput)

        Dim myStrings As New List(Of String)

        ' We use nested loops because the results returned by the service is a list of
        ' lists though in our case, the result set is a list with a single item (this item
        ' being a list of multiple items)
        For Each myResultList As wsGetLOV.ListResult In MyOutput.ListsResult
            For Each myResultValue As wsGetLOV.ListValueResult In myResultList.ListValuesResult
                myStrings.Add(myResultValue.Value)
            Next
        Next

        ListBox1.DataSource = myStrings

    End Sub
End Class
 类似资料:
  • 问题内容: 之前我使用模块在请求中添加标头。现在,我正在对该模块尝试相同的操作。 这是我正在使用的python请求模块:http : //pypi.python.org/pypi/requests 如何向和添加标头。说我必须在标题的每个请求中添加密钥。 问题答案: 从http://docs.python- requests.org/en/latest/user/quickstart/ 您只需要用标

  • 问题内容: 我正在尝试访问网站,但无法将收集到的“ Cookie”添加到传出的POST请求标头中。我已经能够验证它们是否存在于CookieManager中。 HtmlUnit的任何替代方法也将不胜感激。 问题答案: 我发现可以使用WebClient中的setadditionalHeader()添加标题。

  • 问题内容: 我正在将csv文件读入。该csv文件由四列和一些行组成,但没有要添加的标题行。我一直在尝试以下方法: 但是,当我应用代码时,出现以下错误: 错误的确切含义是什么?在python中将标题行添加到csv文件/ pandas df的干净方法是什么? 问题答案: 您可以直接在 names:类似数组,默认为None要使用的列名列表。如果文件不包含标题行,则应显式传递header = None

  • 问题内容: 我正在为应用设置身份验证。在发出登录请求后,将发送一个JSON Web令牌作为响应。我可以通过Ajax将其附加到标题。问题是登录后使用window.location.pathname进行重定向时,因为它不是Ajax请求,所以它没有在标头上附加令牌。我该如何解决? 问题答案: 简短的答案是:您不能使用设置HTTP标头。

  • 问题内容: 我想在标题栏中添加图像(小图标)。 我该怎么做? 问题答案: 由于没有标题栏,因此我假设您是指。话虽这么说,使用。 这是使用的示例。

  • 我正在读取一个csv文件到。这个csv文件由四列和一些行组成,但没有标题行,我想添加它。我一直在尝试以下方法: 但当我应用代码时,我得到以下错误: 这个错误到底意味着什么?在python中,向我的csv文件/df添加标题行的干净方法是什么?