Я разрабатываю библиотеку ComVisible в .NET, которая затем вызывается в старом классе VB6. Что я в основном делаю в классе, так это вызываю веб-службу, анализирую ответ и возвращаю объект с необходимыми данными. Веб-служба разработана таким образом, что она возвращает SoapException
при вызове с неправильным параметром (параметрами). Вот часть моего кода:
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 с правильными параметрами, я получаю правильный ответ. Но если я вызываю его с неправильным параметром, я получаю ошибку времени выполнения -245757
(Object reference was not set to an instance of an object
) в моей программе VB6, и кажется, что она не улавливается предложением catch
в моем коде C# (в то время как я ожидал бы пустой ReplyObject
с заполненным полем Error
возвращается методом).
Я создал тестовый проект C# и скопировал тот же метод (т.е. я вызываю ту же веб-службу из платформы .NET), и я могу подтвердить, что в этом случае SoapException
правильно перехватывается.
Является ли это поведение преднамеренным? Есть ли способ поймать SoapException
в классе ComVisible (поскольку я действительно хотел бы включить сообщение об ошибке в свой объект ответа)?
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
_replay
не инициализирован, пока в предложении catch установлена ошибка:_reply.Error = "Error: " + ex.Message;
- person Algirdas   schedule 04.01.2013-245757 Error 1 - Application-defined or object-defined error : Object reference not set to an instance of an object.
- person Azimuth   schedule 04.01.2013ReplyObject
тоже помечен какComVisible
? - person D Stanley   schedule 04.01.2013ComVisible
. - person Azimuth   schedule 04.01.2013ReplyObject
при возникновении исключения? - person D Stanley   schedule 04.01.2013Error
, и если нет, я пытаюсь прочитать другие поля объекта. Я обновил вопрос своим кодом VB6. - person Azimuth   schedule 04.01.2013