在ComVisible类中未捕获SoapException



我正在。net中开发一个ComVisible库,然后在旧的VB6类中调用。我在类中所做的基本上是调用web服务,解析响应并返回具有必要数据的对象。web服务被设计成在使用错误的参数调用时返回一个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代码与正确的参数,我得到一个适当的答复。但是,如果我用错误的参数调用它,我在VB6程序中得到-245757 (Object reference was not set to an instance of an object)运行时错误,并且似乎没有被我的c#代码中的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

(这只是一个猜测,更适合作为注释,但它相当长)

这是可能的。net运行时处置 ReplyObjectcom对象时,BFRWebServiceconnector类超出范围,也许是因为它是类的属性,而不是在方法中创建?

尝试在GetFromBFR中创建ReplyObject,而不是使其成为类的属性。如果从不同的线程调用COM对象,这也可以防止多线程访问时出现奇怪的错误。

同样,如果在VB程序中有一个特定的行抛出错误(在您调用GetFromBFR之后),您可以在VB中查看变量是否为Nothing,以尝试缩小问题范围。

就像我说的,只是猜测。尽管反驳吧。:)

我很惭愧,原因很简单…而不是如下:

catch (Exception ex)
    {
        _reply.Error = "Error: " + ex.Message;
        if (_client.InnerChannel.State == CommunicationState.Faulted) _client = new WCFPersonClient("WSHttpBinding_IWCFPerson"); //recreate the failed channel
    }

我实际上有以下代码:

catch (Exception ex)
    {
        _reply.Error = "Error: " + ex.Message + "; " + ex.InnerException.Message;
        if (_client.InnerChannel.State == CommunicationState.Faulted) _client = new WCFPersonClient("WSHttpBinding_IWCFPerson"); //recreate the failed channel
    }

结果是ex.InnerExceptionnull这导致了NullPointerException

相关内容

  • 没有找到相关文章

最新更新