jeudi 18 octobre 2007 18:44
For development and testing of our applications, we need to transfer calls internally to a SIP address (SIP phone) on our LAN. Working with the Blind Transfer sample (TRM), we have made the following substitution in TransferExtension.xml
<!--The extension where calls should be transferred. -->
<!--<extension number="1212"/> --> <extension number="sip:email@example.com"/>
Running the sample app as shown gives the following err msg (placing call with native debugger SIP phone)
An exception of type 'System.ArgumentException' occurred in Microsoft.SpeechServer.dll but was not handled in user code
Additional information: The phone number is invalid.
We are quite anxious to solve this problem. If the BlindTransfer activity cannot be made to accept a (valid) SIP address, is there another way to hand off a SIP call from within the SpeechServer?
We can place a SIP call between the two machines on our LAN with no difficulty (using soft phones on each end)
We are accustomed to APIs like Dialogic (where the dx_dial function handles operations like
dx_dial(chdev, dialstr, &cap, DX_CALLP | EV_SYNC);)
If the BlindTransfer requires a specific dial plan to accomplish what we need, how and where can this be set up?
Many thanks. We are really looking forward to solving this problem,
Toutes les réponses
jeudi 18 octobre 2007 19:07
Add a Code activity to the workflow just prior to the blind transfer then set the SIppUri in the code -
this.blindTransfer.CalledPartySipUri = new SipUri(SipUriScheme.Sip, "3333", "192.168.2.8", 0, "transport=tcp");
jeudi 18 octobre 2007 19:44
I may be missing something here, but I don't think there is a CalledPartySipUri property on a BlindTransfer activity.
There is a CalledParty property, but it only accepts a number to be transferred, not a URI.
jeudi 18 octobre 2007 20:15
You are partially correct Ken. :-)
It should be blindTransfer.CalledParty. (got to careful with cut and paste).
It will take a SipUri in the code behind. I used that in a project recently so I know it will work.
jeudi 18 octobre 2007 20:33
I tried that and got "Cannot implicity convert type "Microsoft.SpeechServer.SipUri' to 'Microsoft.SpeechServer.Dialog.TelephonyAddress'.
What I could do is
SipUriTelephonyAddress suta = new SipUriTelephonyAddress();
suta.Port = 5060;
I tested it and it works.
jeudi 18 octobre 2007 20:45
My apologies. I should have fired up the server and looked at the actual code instead of working from memory.
Hre is the correct line of code -
It is essentially the same thing you figured out on your own. The only real difference is this way you can send parameters to the called applicaiton if it is another MSS app.
jeudi 18 octobre 2007 20:51
Yes that makes sense. Thanks for the information.
As a side note, I could not get the transfer to actually work in a test environment. It only worked when I used a soft phone calling into the server. I had the transfer come back to the same computer so as soon as Speech Server hung up, I got an indication of a incoming call on the softphone.
dimanche 21 octobre 2007 19:49
Marshall, many thanks for your quick and helpful reply, including sample code. Kstep, your additional questions and refinements were also very helpful.Please forgive our delayed reply; other fires were burning. We very much appreciate your help. Still wonder why the native debugger sipphone won't manage the xfer...
lundi 22 octobre 2007 10:43
You are observing the intended behaviour of the Voice Response Debugging Window; it is specifically designed to not follow the transfer.
lundi 5 novembre 2007 14:07
Since you guys are all into the details of Blindtransfer, I have an old unsolved question.
Is it possible to send callers number using the BlindTransfer? Scenarios not handled by our application are redirected to a helpdesk who would like to see who is calling.
Can SipUriTelephonyAddress dynamically be used to accomplish this?
Thanks for your help,
lundi 5 novembre 2007 14:26
BlindTransfer is implemented by ITelephonySession.TransferAsync, which doesn't have an overload to set the CallingParty. A BlindTransfer is actually just a SIP REFER sent back to the SipPeer. I would have expected that the SipPeer would send the same CallingParty information to the transfer recipient as it did originally to Speech Server, but I may be wrong here.
There is the following overload: TransferAsync(SipUri address, IList<Header> localHeaders). This allows you to specify any custom headers that you'd like to send to the transfer recipient. All you need then is for your helpdesk agent software to read these SIP headers & present them to the agent.
To use this overload; instead of using BlindTransferActivity, use a CodeActivity and invoke it via the TelephonySession property on your speech workflow.
lundi 19 novembre 2007 06:40
Thanks for the information, Anthony!
I check with our SIPControl deliverer how they have implemented SIP REFER. The TransferAsync-approach seems manageable, besides that it involves the helpdesk agent software - not really in my domain.
Still, now I know what questions to ask and is a good start.
jeudi 8 janvier 2009 12:57Picking up an old issue, Anthony - when you mention that you would have expected the sippeer to send the same callingpary information to the transfer recipient, do you mean the SipPeer on the OCS side or the SipPeer after the OCS (Eicon Sipcontrol in our case)?
If it is the SipPeer on the OCS side that doesn't do this, is it possible to configure it in any way to send this information?
The alternative to BlindTransfer was to use the TransferAsync overload with some headers. That means making a custom control that does this (similar to the SupervicesTransfer example) or is it possible to override some event or method in the blindtranfer control to do this?
Thanks for your help!