Execute workflow from JavaScript in CRM 2011
===

I'm attempting to execute a workflow for records selected in a view, via a ribbon button.  I have a working example using the 'legacy' services for CRM 4 compatibility:

    function invokeWorkflow(workflowId, entityId) {
        var request =
            '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"' +
            '               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
            '               xmlns:xsd="http://www.w3.org/2001/XMLSchema">' +
               GenerateAuthenticationHeader() +
            '  <soap:Body>' +
            '    <Execute xmlns="http://schemas.microsoft.com/crm/2007/WebServices">' +
            '      <Request xsi:type="ExecuteWorkflowRequest">' +
            '        <EntityId>' + entityId + '</EntityId>' +
            '        <WorkflowId>' + workflowId + '</WorkflowId>' +
            '      </Request>' +
            '    </Execute>' +
            '  </soap:Body>' +
            '</soap:Envelope>';

        var xhr = new XMLHttpRequest();
        xhr.open('POST', '/MSCRMservices/2007/crmservice.asmx', false);

        xhr.setRequestHeader('Content-Type', 'text/xml; charset=utf-8');
        xhr.setRequestHeader('SOAPAction', 'http://schemas.microsoft.com/crm/2007/WebServices/Execute');

        xhr.send(request);
    }

However, I want to write this using CRM 2011 services to increase maintainability for future releases.  Here is what I've tried so far, but this does not work - the return code of the call is HTTP 500 (Internal Server Error).

    function invokeWorkflow(workflowId, entityId) {
        var request =
            '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"' +
            '               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
            '               xmlns:xsd="http://www.w3.org/2001/XMLSchema">' +
            '  <soap:Body>' +
            '    <Execute xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services">' +
            '      <Request xsi:type="ExecuteWorkflowRequest">' +
            '        <EntityId>' + entityId + '</EntityId>' +
            '        <WorkflowId>' + workflowId + '</WorkflowId>' +
            '      </Request>' +
            '    </Execute>' +
            '  </soap:Body>' +
            '</soap:Envelope>';

        var xhr = new XMLHttpRequest();
        xhr.open('POST', '/XRMServices/2011/Organization.svc/web', true);

        xhr.setRequestHeader('Accept', 'application/xml, text/xml, */*');
        xhr.setRequestHeader('Content-Type', 'text/xml; charset=utf-8');
        xhr.setRequestHeader('SOAPAction', 'http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute');

        xhr.onreadystatechange = function () { alert(xhr.status); };
        xhr.send(request);
    }

Does anyone know what's wrong with the second script?  I've tried Googling this as best I can but every example I find which claims to be for CRM 2011 is in fact just using the CRM 4 compatibility services (as in the first example).  I've based the second example from a sample in the CRM 2011 SDK, although this doesn't include an example of the ExecuteWorkflowRequest object so it's best-guess only.

Thanks!