Can the BlindTransfer activity be made to accept a SIP address (for xfer to internal LAN address)? RRS feed

  • Question

  • 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:4444@"/>


    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.


    It appears that the control will only accept arguments of  type nnnn.


    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?


    Additional info:

    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,



    Thursday, October 18, 2007 6:44 PM

All replies

  • 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", "", 0, "transport=tcp");


    Thursday, October 18, 2007 7:07 PM
  • Hello Marshall,


    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.




    Thursday, October 18, 2007 7:44 PM
  • 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.


    Thursday, October 18, 2007 8:15 PM

    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.Host = "";

    suta.Port = 5060;

    suta.User = "4444";


    this.blindTransferActivity1.CalledParty = suta;


    I tested it and it works.

    Thursday, October 18, 2007 8:33 PM
  • 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 -


    this.blindTransferActivity1.CalledParty = new SipUriTelephonyAddress(new SipUri(SipUriScheme.Sip, runScript.TargetSIPEndPt.ToString(), this.TelephonySession.CallInfo.CalledParty.Uri.Host.ToString(), 0, parms));


    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.

    Thursday, October 18, 2007 8:45 PM

    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.

    Thursday, October 18, 2007 8:51 PM
  • 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...



    Sunday, October 21, 2007 7:49 PM
  • You are observing the intended behaviour of the Voice Response Debugging Window; it is specifically designed to not follow the transfer.


    Monday, October 22, 2007 10:43 AM
  • Hi!

    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,


    Monday, November 5, 2007 2:07 PM
  • 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.

    Monday, November 5, 2007 2:26 PM
  • 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.


    / Markus

    Monday, November 19, 2007 6:40 AM
  • Picking 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!
    Thursday, January 8, 2009 12:57 PM