The following annotated MSPL script filters incoming SIP responses and attempts to select the best endpoint for each message based on the endpoint ID (EPID).

  Copy imageCopy Code
<?xml version="1.0">
<lc:applicationManifest
 lc:appUri="http://www.contoso.com/DefaultRoutingScript"
 xmlns:lc="http://schemas.microsoft.com/lcs/2006/05">
<lc:requestFilter methodNames="INVITE,MESSAGE,INFO,REFER,ACK,BYE,OTHER"
						strictRoute="false"
						registrarGenerated="true"
						domainSupported="true"/ >
<lc:responseFilter reasonCodes="NONE" />
<lc:proxyByDefault action="true" />
<lc:scriptOnly />
<lc:splScript><![CDATA[
	//
	// This script handles default routing of requests to Lync Server.  It
	// looks up all the registered endpoints for the To: user@host and tries
	// to pick the best endpoint to route to based on:
	//  EPID
	//
	// Endpoints with no presence or an availability less than 100, or
	// no routing information (for example, set presence without
	// register) are not considered.
	//

	Log( "Debugr", 1, "we have a request - ", sipRequest.Method );

	//
	// Build the user@host from the To: header.
	//
	toUri = GetUri( sipRequest.To );
	toUserAtHost = Concatenate( GetUserName( toUri ), "@", GetHostName( toUri ) );

	//
	// Determine whether this request is already asking for a specific EPID
	// via a parameter in the To: header.
	//
	requestEPID = GetParameterValue( sipRequest.To, "EPID" );

	//
	// Now loop over all the endpoints for the To: user@host.
	//
	bestEPID = "";
	bestAgeOfPresence = 0x7FFFFFFF;
	bestAvailability = 0;
	bestActivity = 0;
	bestContactInfo = "";
	Log( "Debugr", 1, "EPID - ", requestEPID );
	Log( "Debugr", 1, "toUserAtHost - ", toUserAtHost );
	foreach (dbEndpoint in QueryEndpoints( toUserAtHost, true )) {
		Log( "Debugr", 1, "	endpoint.EPID - ", dbEndpoint.EPID );
		Log( "Debugr", 1, "	endpoint.ContactInfo - ", dbEndpoint.ContactInfo );

		//
		// First, determine whether this endpoint supports the method in the request.
		//
		if (!SupportsMethod( sipRequest.Method, dbEndpoint.StandardMethods, dbEndpoint.ExtraMethods )) {
			//
			// Skip this endpoint because it cannot handle the method on this request.
			//
			Log( "Debugr", 1, "		* skipped because of method" );
			continue;
		}

		if (requestEPID != "") {
			if (requestEPID == dbEndpoint.EPID) {
				//
				// The request is already targeted at a specific EPID that can handle the method,
				// so use this endpoint.
				//
				Log( "Debugr", 1, "		* matched EPID" );
				bestContactInfo = dbEndpoint.ContactInfo;
				break;
		}
			else {
				//
				// The request is targeted at a specific EPID, but does not match this endpoint.
				// Skip this endpoint.
				//
				Log( "Debugr", 1, "		* skipped because of EPID" );
				continue;
		}
	}


		bestEPID = dbEndpoint.EPID;
		bestContactInfo = dbEndpoint.ContactInfo;
		Log( "Debugr", 1, "		*** new best contact" );
	}


	//
	// See if an endpoint to proxy to was found.
	//
	if (bestContactInfo == "") {
		/* Uncomment this block of code and the two assignments to sawAtLeastOneEndpoint
		 above if you want to run a UAC application before this one and have this code
		 route your messages to the correct home server.
		if (!sawAtLeastOneEndpoint) {
			homeServer = QueryHomeServer( toUserAtHost );
			if (!EqualString( homeServer, FQDN, true )) {
				Log( "Debugr", 1, toUserAtHost, " is homed on ", homeServer );
				newRequestUri = Concatenate( sipRequest.RequestUri, ";maddr=", homeServer );
				Log( "Debugr", 1, "Request is being routed to ", newRequestUri );
				AddHeader( "MS-LBVIA", FQDN );
				ProxyRequest( newRequestUri );
				return;
		}
	}
		*/
		Log( "Debugr", 1, "Responding 480 - temporarily unavailable as no suitable endpoint found" );
		Respond( 480, "Temporarily Unavailable" );
}
	else {
		if (requestEPID == "") {
			Log( "Debugr", 1, "Adding missing EPID '", bestEPID, "' to To header" );
			SetParameterValue( "To", "epid", bestEPID );
		}

		Log( "Debugr", 1, "Proxying request to - ", bestContactInfo );
		ProxyRequest( bestContactInfo );
	}

	return;
]]></lc:splScript>
</lc:applicationManifest>
NoteNote

The use of the following patterns:

request.RequestUri = ...

ProxyRequest(sipRequestUri)

If you change RequestUri, the request is marked as routed without providing a request target. Applications that do not have routing information for a request should not modify the request-uri. We recommend that non-routing applications never change the request-uri.