WSDL で定義され、SOAP プロトコルを使用して Siebel Web サービスにアクセスする VB.NET 2008 プログラムがあります。
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:Header/>
次のように、ユーザー名、パスワード、およびセッションタイプを含むヘッダーに手動で置き換えた場合にのみ機能します。
<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 を Visual Studio 2008 にインポートし、VB コードでサービスを定義し、Web サービス メソッドを参照することに問題はありません。ただし、空のヘッダーの代わりに更新されたヘッダーが Web サービス要求に含まれるように、VB で 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 に入ります。
ヘッダーをエンドポイントに追加する必要があると思います ( http://msdn.microsoft.com/en-us/library/ms731749.aspxおよびhttp://msdn.microsoft.com/en-us/library/systemによる) .servicemodel.configuration.serviceendpointelement.aspx ) ですが、VB でこれを行う方法がわかりません。