古い VB6 クラスで呼び出される .NET で ComVisible ライブラリを開発しています。クラスで基本的に行うことは、Web サービスを呼び出し、応答を解析し、必要なデータを含むオブジェクトを返すことです。SoapException
Web サービスは、間違ったパラメーターで呼び出された場合に を返すように設計されています。ここに私のコードの一部があります:
private static WCFPersonClient _client;
private static ReplyObject _reply;
public BFRWebServiceconnector()
{
_client = new WCFPersonClient("WSHttpBinding_IWCFPerson");
_reply = new ReplyObject ();
}
[ComVisible(true)]
public ReplyObject GetFromBFR(string bestallningsID, string personnr, bool reservNummer = false)
{
try
{
var response = new XmlDocument();
//the service operation returns XML but the method in the generated service reference returns a string for some reason
var responseStr = _client.GetUserData(orderID, personnr, 3); reason.
response.LoadXml(responseStr);
//parse the response and fill the reply object
.......
}
catch (Exception ex)
{
_reply.Error = "Error: " + ex.Message;
if (_client.InnerChannel.State == CommunicationState.Faulted) _client = new WCFPersonClient("WSHttpBinding_IWCFPerson"); //recreate the failed channel
}
return _reply;
}
正しいパラメーターを使用して VB6 コードからこのメソッドを呼び出そうとすると、適切な応答が返されます。しかし、間違ったパラメーターで呼び出すと、VB6 プログラムで-245757
( ) ランタイム エラーが発生し、C# コードの句でキャッチされていないように見えます (ただし、メソッドによって空のフィールドが返されることを期待します)。 .Object reference was not set to an instance of an object
catch
ReplyObject
Error
テスト C# プロジェクトを作成し、同じメソッドをコピーしました (つまり、.NET プラットフォーム内から同じ Web サービスを呼び出します)。この場合、SoapException
が適切にキャッチされていることを確認できます。
この動作は意図的なものですか? ComVisible クラス内でをキャッチする方法はありSoapException
ますか (返信オブジェクトにエラー メッセージを含めたいので)?
UPD:私の VB6 コードは次のとおりです。
Set BFRWSCReply = New ReplyObject
Set BFRWSC = New BFRWebbServiceconnector
Set BFRWSCReply = BFRWSC.GetFromBFR(m_BeställningsID, personnr)
If Not IsNull(BFRWSCReply) Then
If BFRWSCReply.Error= "" Then
m_sEfternamn = BFRWSCReply.Efternamn
//etc i.e. copy fields from the ReplyObject
Else
MsgBox BFRWSCReply.Error, vbExclamation
End If
End If