As I understand, you want to call a web service at some point after posting an invoice. It mustn't be in as transaction when the invoice is posted, because a failure in the code (e.g. the web service not being reachable) would prevent invoice posting completely.
There are several possible solutions. For example, you could have a table working as a queue of messages to be sent. In the transaction, you'll write a record to this table. Later, e.g. by a periodic job, you can process records in the queue in a separate transaction.
Business events do something similar.
By the way, there are quite a few things you can improve in your code. For instance, you forgot to dispose resources created in the try block. You can access properties of .NET objects simply by name (e.g. request.Method = 'POST') instead of through get_* and set_* methods (such as request.set_Method('POST')). You can catch System.Exception object instead of catching Exception::CLRError and then getting the last exception by AifUtil::getClrErrorMessage(). The call of AifUtil::getClrErrorMessage() in the last catch block doesn't make sense to me - it'll never be an CLR exception, because they're already handled above. InteropPermission isn't needed. The block of code for Sent status belongs to the try block. It doesn't make sense in finally as the condition will never be met in case of an exception.