Microsoft has some great links about design patterns and reference architectures in the Azure Center.
If you don't want to affect the user's response, I would dump the message to a service-internal queue, and send those messages to the service bus on a separate worker. If message delivery is imperative, then this is probably a good strategy to use, because you can save the data and re-visit it if necessary.
I know you said you don't want to affect response time, but do want to deliver the messages as part of the HTTP Controller Action. Here are some considerations:
- Where is your API being installed with respect to the Azure queue? Are both in Azure? Are the services co-located?
- Does the caller need to be notified if delivery to the Azure Service Bus fails?
- Are you performing any other processing inside the controller that is dependent on the outcome of posting to the service bus?
- Should re-tries be supported?
If #1 is anything resembling "yes," then I would suggest that you can just wrap the action of posting to the service bus inside a Task, and determining your own result based on the outcome of that task (and whatever other processing you're performing). If there are multiple scenarios, and #1 is yes, then you can also consider having two modules that implement a common interface, but essentially using a strategy pattern for different (installation) scenarios.
If you aren't co-located, or expect to be anything other than co-located with Azure at any point, it is worth considering using a local queue to publish messages to, and spawning some kind of a worker to handle messages on that queue. You may find this provides the best trade-off of user experience and reliability.
Hope this helps.