사용자 지정 VDI 솔루션용 WSDL 인터페이스
개발자는 VDI(가상 데스크톱 인프라) 솔루션을 관리하는 사용자 지정 웹 서비스를 만들 수 있습니다.
Windows Server 2008 R2부터 클라이언트 컴퓨터는 VMMWebServerClient.dll 필터 플러그 인을 사용하여 가상 머신 관리를 수행하는 웹 서비스와 통신할 수 있습니다. 이 필터 플러그 인에서 작동하는 사용자 지정 웹 서비스를 구현할 수 있습니다. 필터 플러그 인과 통신하려면 웹 서비스가 다음 WSDL(웹 서비스 정의 언어) 파일에 정의된 메서드를 구현해야 합니다.
<wsdl:definitions xmlns:soap="https://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsu="https://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:soapenc="https://schemas.xmlsoap.org/soap/encoding/" xmlns:wsam="https://www.w3.org/2007/05/addressing/metadata" xmlns:tns="https://Microsoft.Virtualization.RDV" xmlns:wsa="https://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsp="https://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="https://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsaw="https://www.w3.org/2006/05/addressing/wsdl" xmlns:soap12="https://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsa10="https://www.w3.org/2005/08/addressing" xmlns:wsx="https://schemas.xmlsoap.org/ws/2004/09/mex" targetNamespace="https://Microsoft.Virtualization.RDV" xmlns:wsdl="https://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<xsd:schema targetNamespace="https://Microsoft.Virtualization.RDV/Imports" xmlns:xs="https://www.w3.org/2001/XMLSchema">
<xsd:import namespace="https://Microsoft.Virtualization.RDV" />
<xsd:import namespace="http://schemas.microsoft.com/2003/10/Serialization/" />
<xsd:import namespace="https://schemas.datacontract.org/2004/07/Microsoft.Virtualization.RDV" />
<xs:element name="StartVM">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="type" xmlns:q1="https://schemas.datacontract.org/2004/07/Microsoft.Virtualization.RDV" type="q1:NameType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="StartVMResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="StartVMResult" xmlns:q2="http://schemas.microsoft.com/2003/10/Serialization/" type="q2:guid" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="SetLocale">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="locale" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="SetLocaleResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="SetLocaleResult" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="GetVM">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="type" xmlns:q3="https://schemas.datacontract.org/2004/07/Microsoft.Virtualization.RDV" type="q3:NameType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="GetVMResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="GetVMResult" nillable="true" xmlns:q4="https://schemas.datacontract.org/2004/07/Microsoft.Virtualization.RDV" type="q4:VMResult" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="PlaceVM">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="type" xmlns:q5="https://schemas.datacontract.org/2004/07/Microsoft.Virtualization.RDV" type="q5:NameType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="PlaceVMResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="PlaceVMResult" xmlns:q6="http://schemas.microsoft.com/2003/10/Serialization/" type="q6:guid" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="JobUpdated">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="job" nillable="true" xmlns:q7="https://schemas.datacontract.org/2004/07/Microsoft.Virtualization.RDV" type="q7:Job" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="NameType">
<xs:restriction base="xs:string">
<xs:enumeration value="COMPUTER_NAME_FQDN" />
<xs:enumeration value="GUID" />
<xs:enumeration value="VM_NAME" />
</xs:restriction>
</xs:simpleType>
<xs:element name="NameType" nillable="true" type="tns:NameType" />
<xs:complexType name="VMResult">
<xs:sequence>
<xs:element minOccurs="0" name="DetailedErrorString" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="ErrorID" type="tns:VMError" />
<xs:element minOccurs="0" name="VMList" nillable="true" type="tns:ArrayOfVM" />
</xs:sequence>
</xs:complexType>
<xs:element name="VMResult" nillable="true" type="tns:VMResult" />
<xs:simpleType name="VMError">
<xs:restriction base="xs:string">
<xs:enumeration value="ERROR_VM_SUCCESS" />
<xs:enumeration value="ERROR_VM_START" />
<xs:enumeration value="ERROR_VM_PLACEMENT" />
<xs:enumeration value="ERROR_VM_SAVE" />
<xs:enumeration value="ERROR_VM_RESTORE" />
<xs:enumeration value="ERROR_VM_MISSING" />
<xs:enumeration value="ERROR_JOB_NOT_FOUND" />
<xs:enumeration value="ERROR_VM_LOCKED" />
<xs:enumeration value="ERROR_VM_NO_PERMISSION" />
<xs:enumeration value="ERROR_VM_STATE" />
<xs:enumeration value="ERROR_SERVER_CONNECTION_LOST" />
<xs:enumeration value="ERROR_SERVER_CONNECTION_SETUP" />
</xs:restriction>
</xs:simpleType>
<xs:element name="VMError" nillable="true" type="tns:VMError" />
<xs:complexType name="ArrayOfVM">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="VM" nillable="true" type="tns:VM" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfVM" nillable="true" type="tns:ArrayOfVM" />
<xs:complexType name="VM">
<xs:sequence>
<xs:element minOccurs="0" name="HostFQDN" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="HostType" type="tns:VMHostType" />
<xs:element minOccurs="0" name="ID" type="ser:guid" />
<xs:element minOccurs="0" name="Name" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="Status" type="tns:VMStatus" />
</xs:sequence>
</xs:complexType>
<xs:element name="VM" nillable="true" type="tns:VM" />
<xs:simpleType name="VMHostType">
<xs:restriction base="xs:string">
<xs:enumeration value="VM_LIBRARY" />
<xs:enumeration value="VM_HOST" />
</xs:restriction>
</xs:simpleType>
<xs:element name="VMHostType" nillable="true" type="tns:VMHostType" />
<xs:simpleType name="VMStatus">
<xs:restriction base="xs:string">
<xs:enumeration value="VM_STATUS_UNKNOWN" />
<xs:enumeration value="VM_STATUS_MIGRATING" />
<xs:enumeration value="VM_STATUS_RUNNING" />
<xs:enumeration value="VM_STATUS_HIBERNATED" />
<xs:enumeration value="VM_STATUS_PAUSED" />
<xs:enumeration value="VM_STATUS_STOPPED" />
<xs:enumeration value="VM_STATUS_GUEST_BOOTED" />
<xs:enumeration value="VM_STATUS_GUEST_REBOOTED" />
<xs:enumeration value="VM_STATUS_GUEST_READY" />
</xs:restriction>
</xs:simpleType>
<xs:element name="VMStatus" nillable="true" type="tns:VMStatus" />
<xs:complexType name="Job">
<xs:sequence>
<xs:element minOccurs="0" name="DetailedErrorString" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="ErrorID" type="tns:VMError" />
<xs:element minOccurs="0" name="ID" type="ser:guid" />
<xs:element minOccurs="0" name="Name" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="Progress" type="xs:double" />
<xs:element minOccurs="0" name="Status" type="tns:JobStatus" />
<xs:element minOccurs="0" name="Step" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="Job" nillable="true" type="tns:Job" />
<xs:simpleType name="JobStatus">
<xs:restriction base="xs:string">
<xs:enumeration value="DOES_NOT_EXISTS" />
<xs:enumeration value="RUNNING" />
<xs:enumeration value="FAILED" />
<xs:enumeration value="COMPLETED" />
</xs:restriction>
</xs:simpleType>
<xs:element name="JobStatus" nillable="true" type="tns:JobStatus" />
</xsd:schema>
</wsdl:types>
<wsdl:message name="IRDVServer_StartVM_InputMessage">
<wsdl:part name="parameters" element="tns:StartVM" />
</wsdl:message>
<wsdl:message name="IRDVServer_StartVM_OutputMessage">
<wsdl:part name="parameters" element="tns:StartVMResponse" />
</wsdl:message>
<wsdl:message name="IRDVServer_SetLocale_InputMessage">
<wsdl:part name="parameters" element="tns:SetLocale" />
</wsdl:message>
<wsdl:message name="IRDVServer_SetLocale_OutputMessage">
<wsdl:part name="parameters" element="tns:SetLocaleResponse" />
</wsdl:message>
<wsdl:message name="IRDVServer_GetVM_InputMessage">
<wsdl:part name="parameters" element="tns:GetVM" />
</wsdl:message>
<wsdl:message name="IRDVServer_GetVM_OutputMessage">
<wsdl:part name="parameters" element="tns:GetVMResponse" />
</wsdl:message>
<wsdl:message name="IRDVServer_PlaceVM_InputMessage">
<wsdl:part name="parameters" element="tns:PlaceVM" />
</wsdl:message>
<wsdl:message name="IRDVServer_PlaceVM_OutputMessage">
<wsdl:part name="parameters" element="tns:PlaceVMResponse" />
</wsdl:message>
<wsdl:message name="IRDVServer_JobUpdated_OutputCallbackMessage">
<wsdl:part name="parameters" element="tns:JobUpdated" />
</wsdl:message>
<wsdl:portType msc:usingSession="true" name="IRDVServer">
<wsdl:operation msc:isInitiating="true" msc:isTerminating="false" name="StartVM">
<wsdl:input wsaw:Action="https://Microsoft.Virtualization.RDV/IRDVServer/StartVM" message="tns:IRDVServer_StartVM_InputMessage" />
<wsdl:output wsaw:Action="https://Microsoft.Virtualization.RDV/IRDVServer/StartVMResponse" message="tns:IRDVServer_StartVM_OutputMessage" />
</wsdl:operation>
<wsdl:operation msc:isInitiating="true" msc:isTerminating="false" name="SetLocale">
<wsdl:input wsaw:Action="https://Microsoft.Virtualization.RDV/IRDVServer/SetLocale" message="tns:IRDVServer_SetLocale_InputMessage" />
<wsdl:output wsaw:Action="https://Microsoft.Virtualization.RDV/IRDVServer/SetLocaleResponse" message="tns:IRDVServer_SetLocale_OutputMessage" />
</wsdl:operation>
<wsdl:operation msc:isInitiating="true" msc:isTerminating="false" name="GetVM">
<wsdl:input wsaw:Action="https://Microsoft.Virtualization.RDV/IRDVServer/GetVM" message="tns:IRDVServer_GetVM_InputMessage" />
<wsdl:output wsaw:Action="https://Microsoft.Virtualization.RDV/IRDVServer/GetVMResponse" message="tns:IRDVServer_GetVM_OutputMessage" />
</wsdl:operation>
<wsdl:operation msc:isInitiating="true" msc:isTerminating="false" name="PlaceVM">
<wsdl:input wsaw:Action="https://Microsoft.Virtualization.RDV/IRDVServer/PlaceVM" message="tns:IRDVServer_PlaceVM_InputMessage" />
<wsdl:output wsaw:Action="https://Microsoft.Virtualization.RDV/IRDVServer/PlaceVMResponse" message="tns:IRDVServer_PlaceVM_OutputMessage" />
</wsdl:operation>
<wsdl:operation msc:isInitiating="true" msc:isTerminating="false" name="JobUpdated">
<wsdl:output wsaw:Action="https://Microsoft.Virtualization.RDV/IRDVServer/JobUpdated" message="tns:IRDVServer_JobUpdated_OutputCallbackMessage" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="DefaultBinding_IRDVServer" type="tns:IRDVServer">
<soap:binding transport="https://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="StartVM">
<soap:operation soapAction="https://Microsoft.Virtualization.RDV/IRDVServer/StartVM" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="SetLocale">
<soap:operation soapAction="https://Microsoft.Virtualization.RDV/IRDVServer/SetLocale" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetVM">
<soap:operation soapAction="https://Microsoft.Virtualization.RDV/IRDVServer/GetVM" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="PlaceVM">
<soap:operation soapAction="https://Microsoft.Virtualization.RDV/IRDVServer/PlaceVM" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="JobUpdated">
<soap:operation soapAction="https://Microsoft.Virtualization.RDV/IRDVServer/JobUpdated" style="document" />
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
</wsdl:definitions>
이 WSDL 파일은 다음 메서드를 정의합니다.
GetVM
필터 플러그 인은 이 메서드를 호출하여 지정된 가상 머신에 대한 정보를 가져옵니다. 가상 머신의 상태, 호스트 이름, 호스트 유형 및 GUID를 반환해야 합니다.
필터 플러그 인은 다음 요소를 메서드에 전달합니다.
<xs:element name="GetVM">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="type" xmlns:q3="https://schemas.datacontract.org/2004/07/Microsoft.Virtualization.RDV" type="q3:NameType" />
</xs:sequence>
</xs:complexType>
</xs:element>
웹 서비스는 필터 플러그 인에 다음 요소를 반환해야 합니다.
<xs:element name="GetVMResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="GetVMResult" nillable="true" xmlns:q4="https://schemas.datacontract.org/2004/07/Microsoft.Virtualization.RDV" type="q4:VMResult" />
</xs:sequence>
</xs:complexType>
</xs:element>
JobUpdated
웹 서비스는 이 메서드를 호출하여 필터 플러그 인에 기존 작업이 변경되었음을 알립니다. 이 메서드를 구현할 때 함수가 성공하면 S_OK 반환합니다. 실패하면 오류를 나타내는 HRESULT 값을 반환합니다. 일반적인 오류 코드 목록은 일반 HRESULT 값을 참조하세요.
웹 서비스는 다음 요소를 필터 플러그 인에 전달합니다.
<xs:element name="JobUpdated">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="job" nillable="true" xmlns:q7="https://schemas.datacontract.org/2004/07/Microsoft.Virtualization.RDV" type="q7:Job" />
</xs:sequence>
</xs:complexType>
</xs:element>
PlaceVM
필터 플러그 인은 이 메서드를 호출하여 가상 머신을 라이브러리에서 호스트 컴퓨터로 마이그레이션합니다. 메서드는 작업을 생성하고 추적을 위해 고유한 작업 식별자를 필터 플러그 인에 반환해야 합니다. 처리가 완료되면 웹 서비스에서 JobUpdated를 호출해야 합니다.
필터 플러그 인은 다음 요소를 메서드에 전달합니다.
<xs:element name="PlaceVM">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="type" xmlns:q5="https://schemas.datacontract.org/2004/07/Microsoft.Virtualization.RDV" type="q5:NameType" />
</xs:sequence>
</xs:complexType>
</xs:element>
웹 서비스는 필터 플러그 인에 다음 요소를 반환해야 합니다.
<xs:element name="PlaceVMResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="PlaceVMResult" xmlns:q6="http://schemas.microsoft.com/2003/10/Serialization/" type="q6:guid" />
</xs:sequence>
</xs:complexType>
</xs:element>
SetLocale
필터 플러그 인은 이 메서드를 호출하여 오류 문자열에 사용할 로캘을 지정합니다.
필터 플러그 인은 다음 요소를 메서드에 전달합니다.
<xs:element name="SetLocale">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="locale" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
웹 서비스는 필터 플러그 인에 다음 요소를 반환해야 합니다.
<xs:element name="SetLocaleResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="SetLocaleResult" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
StartVM
필터 플러그 인은 이 메서드를 호출하여 현재 호스트 컴퓨터에서 가상 머신을 시작합니다. 현재 호스트 컴퓨터에서 가상 머신을 시작할 수 없는 경우 이 메서드는 가상 머신을 최상의 호스트로 마이그레이션한 다음 시작해야 합니다. 메서드는 작업을 생성하고 추적을 위해 고유한 작업 식별자를 필터 플러그 인에 반환해야 합니다. 처리가 완료되면 웹 서비스에서 JobUpdated를 호출해야 합니다.
필터 플러그 인은 다음 요소를 메서드에 전달합니다.
<xs:element name="StartVM">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="type" xmlns:q1="https://schemas.datacontract.org/2004/07/Microsoft.Virtualization.RDV" type="q1:NameType" />
</xs:sequence>
</xs:complexType>
</xs:element>
웹 서비스는 필터 플러그 인에 다음 요소를 반환해야 합니다.
<xs:element name="StartVMResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="StartVMResult" xmlns:q2="http://schemas.microsoft.com/2003/10/Serialization/" type="q2:guid" />
</xs:sequence>
</xs:complexType>
</xs:element>