AsmxTerraServiceSampleWithCustomProxy
En este ejemplo se muestra el proxy de servicio que habla con un servicio ASMX TerraService mediante WS_HTTP_PROXY_SETTING_MODE_CUSTOM propiedad de canal.
AsmxCustomProxyClient.cpp
//------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
//------------------------------------------------------------
#include "windows.h"
#include "winhttp.h"
#ifndef UNICODE
#define UNICODE
#endif
#include "WebServices.h"
#include "process.h"
#include "stdio.h"
#include "string.h"
#include "terraserviceusa.com.wsdl.h"
// Print out rich error info
void PrintError(HRESULT errorCode, WS_ERROR* error)
{
wprintf(L"Failure: errorCode=0x%lx\n", errorCode);
if (errorCode == E_INVALIDARG || errorCode == WS_E_INVALID_OPERATION)
{
// Correct use of the APIs should never generate these errors
wprintf(L"The error was due to an invalid use of an API. This is likely due to a bug in the program.\n");
DebugBreak();
}
HRESULT hr = NOERROR;
if (error != NULL)
{
ULONG errorCount;
hr = WsGetErrorProperty(error, WS_ERROR_PROPERTY_STRING_COUNT, &errorCount, sizeof(errorCount));
if (FAILED(hr))
{
goto Exit;
}
for (ULONG i = 0; i < errorCount; i++)
{
WS_STRING string;
hr = WsGetErrorString(error, i, &string);
if (FAILED(hr))
{
goto Exit;
}
wprintf(L"%.*s\n", string.length, string.chars);
}
}
Exit:
if (FAILED(hr))
{
wprintf(L"Could not get error string (errorCode=0x%lx)\n", hr);
}
}
// Main entry point
int __cdecl wmain(int argc, __in_ecount(argc) wchar_t **argv)
{
UNREFERENCED_PARAMETER(argc);
UNREFERENCED_PARAMETER(argv);
HRESULT hr = NOERROR;
WS_ERROR* error = NULL;
WS_SERVICE_PROXY* serviceProxy = NULL;
WS_HEAP* heap = NULL;
WS_ENDPOINT_ADDRESS address = {};
WS_STRING serviceUrl = WS_STRING_VALUE(L"https://terraservice.net/TerraService2.asmx");
WS_CHANNEL_PROPERTY channelPropertyArray[4];
WS_ADDRESSING_VERSION addressingVersion = WS_ADDRESSING_VERSION_TRANSPORT;
WS_ENVELOPE_VERSION envelopeVersion = WS_ENVELOPE_VERSION_SOAP_1_1;
WS_STRING place = WS_STRING_VALUE(L"");
WS_HTTP_PROXY_SETTING_MODE proxySettingMode = WS_HTTP_PROXY_SETTING_MODE_CUSTOM;
WS_CUSTOM_HTTP_PROXY customProxy = {};
address.url = serviceUrl;
WINHTTP_AUTOPROXY_OPTIONS autoProxyOptions = {};
WINHTTP_PROXY_INFO proxyInfo = {};
HINTERNET session = NULL;
channelPropertyArray[0].id = WS_CHANNEL_PROPERTY_ADDRESSING_VERSION;
channelPropertyArray[0].value = &addressingVersion;
channelPropertyArray[0].valueSize = sizeof(addressingVersion);
channelPropertyArray[1].id = WS_CHANNEL_PROPERTY_ENVELOPE_VERSION;
channelPropertyArray[1].value = &envelopeVersion;
channelPropertyArray[1].valueSize = sizeof(envelopeVersion);
channelPropertyArray[2].id = WS_CHANNEL_PROPERTY_HTTP_PROXY_SETTING_MODE;
channelPropertyArray[2].value = &proxySettingMode;
channelPropertyArray[2].valueSize = sizeof(proxySettingMode);
channelPropertyArray[3].id = WS_CHANNEL_PROPERTY_CUSTOM_HTTP_PROXY;
channelPropertyArray[3].value = &customProxy;
channelPropertyArray[3].valueSize = sizeof(customProxy);
// This part illustrates how to setup a HTTP header authentication security binding
// against the HTTP proxy server in case it requires authentication.
// declare and initialize a default windows credential
WS_STRING_WINDOWS_INTEGRATED_AUTH_CREDENTIAL windowsCredential = {}; // zero out the struct
windowsCredential.credential.credentialType = WS_STRING_WINDOWS_INTEGRATED_AUTH_CREDENTIAL_TYPE; // set the credential type
// for illustration only; usernames and passwords should never be included in source files
windowsCredential.username.chars = L"domain\\user";
windowsCredential.username.length = (ULONG)wcslen(windowsCredential.username.chars);
windowsCredential.password.chars = L"password";
windowsCredential.password.length = (ULONG)wcslen(windowsCredential.password.chars);
// declare and initialize properties to set the authentication scheme to Basic
ULONG scheme = WS_HTTP_HEADER_AUTH_SCHEME_NEGOTIATE;
ULONG target = WS_HTTP_HEADER_AUTH_TARGET_PROXY;
WS_SECURITY_BINDING_PROPERTY httpProxyAuthBindingProperties[2] =
{
{ WS_SECURITY_BINDING_PROPERTY_HTTP_HEADER_AUTH_SCHEME, &scheme, sizeof(scheme) },
{ WS_SECURITY_BINDING_PROPERTY_HTTP_HEADER_AUTH_TARGET, &target, sizeof(target) }
};
// declare and initialize an HTTP header authentication security binding for the HTTP proxy server
WS_HTTP_HEADER_AUTH_SECURITY_BINDING httpProxyAuthBinding = {}; // zero out the struct
httpProxyAuthBinding.binding.bindingType = WS_HTTP_HEADER_AUTH_SECURITY_BINDING_TYPE; // set the binding type
httpProxyAuthBinding.binding.properties = httpProxyAuthBindingProperties;
httpProxyAuthBinding.binding.propertyCount = WsCountOf(httpProxyAuthBindingProperties);
httpProxyAuthBinding.clientCredential = &windowsCredential.credential;
// declare and initialize the array of all security bindings
WS_SECURITY_BINDING* securityBindings[1] = { &httpProxyAuthBinding.binding };
// declare and initialize the security description
WS_SECURITY_DESCRIPTION securityDescription = {}; // zero out the struct
securityDescription.securityBindings = securityBindings;
securityDescription.securityBindingCount = WsCountOf(securityBindings);
// Create an error object for storing rich error information
hr = WsCreateError(
NULL,
0,
&error);
if (FAILED(hr))
{
goto Exit;
}
// Create a heap to store deserialized data
hr = WsCreateHeap(
/*maxSize*/ 2048,
/*trimSize*/ 512,
NULL,
0,
&heap,
error);
if (FAILED(hr))
{
goto Exit;
}
session = WinHttpOpen(L"NWS Example",
WINHTTP_ACCESS_TYPE_NO_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS,
WINHTTP_FLAG_ASYNC);
if (!session)
{
hr = HRESULT_FROM_WIN32(GetLastError());
goto Exit;
}
autoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_RUN_INPROCESS | WINHTTP_AUTOPROXY_AUTO_DETECT;
autoProxyOptions.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DHCP | WINHTTP_AUTO_DETECT_TYPE_DNS_A;
autoProxyOptions.fAutoLogonIfChallenged = FALSE;
WinHttpGetProxyForUrl(
session,
serviceUrl.chars,
&autoProxyOptions,
&proxyInfo);
if (proxyInfo.dwAccessType == WINHTTP_ACCESS_TYPE_NAMED_PROXY)
{
if (proxyInfo.lpszProxy)
{
customProxy.servers.chars = proxyInfo.lpszProxy;
customProxy.servers.length = (ULONG)wcslen(proxyInfo.lpszProxy);
}
if (proxyInfo.lpszProxyBypass)
{
customProxy.bypass.chars = proxyInfo.lpszProxyBypass;
customProxy.bypass.length = (ULONG)wcslen(proxyInfo.lpszProxyBypass);
}
}
hr = WsCreateServiceProxy(
WS_CHANNEL_TYPE_REQUEST,
WS_HTTP_CHANNEL_BINDING,
&securityDescription,
NULL,
0,
channelPropertyArray,
WsCountOf(channelPropertyArray),
&serviceProxy,
error);
if (FAILED(hr))
{
goto Exit;
}
// Open channel to address
hr = WsOpenServiceProxy(
serviceProxy,
&address,
NULL,
error);
if (FAILED(hr))
{
goto Exit;
}
for (int i = 0; i < 100; i++)
{
LonLatPt point = {10.0, 10.0};
hr = TerraServiceSoap_ConvertLonLatPtToNearestPlace(
serviceProxy,
&point,
&place,
heap,
NULL,
0,
NULL,
error);
if (FAILED(hr))
{
goto Exit;
}
wprintf(L"Place @ Lattitude=%f, Longitutde=%f is %s\n",
point.Lon,
point.Lat,
place);
fflush(stdout);
hr = WsResetHeap(
heap,
error);
if (FAILED(hr))
{
goto Exit;
}
}
Exit:
if (FAILED(hr))
{
// Print out the error
PrintError(hr, error);
}
fflush(
stdout);
if (proxyInfo.lpszProxy)
{
::GlobalFree(proxyInfo.lpszProxy);
}
if (proxyInfo.lpszProxyBypass)
{
::GlobalFree(proxyInfo.lpszProxyBypass);
}
if (serviceProxy != NULL)
{
WsCloseServiceProxy(serviceProxy, NULL, NULL);
WsFreeServiceProxy(serviceProxy);
}
if (!session)
{
WinHttpCloseHandle(session);
}
if (heap != NULL)
{
WsFreeHeap(heap);
}
if (error != NULL)
{
WsFreeError(error);
}
fflush(stdout);
return SUCCEEDED(hr) ? 0 : -1;
}
terraserviceusa.com.wsdl
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soap="https://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="https://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="https://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="https://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="https://terraservice-usa.com/" xmlns:s="https://www.w3.org/2001/XMLSchema" xmlns:http="https://schemas.xmlsoap.org/wsdl/http/" targetNamespace="https://terraservice-usa.com/" xmlns:wsdl="https://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="https://terraservice-usa.com/">
<s:element name="ConvertLonLatPtToNearestPlace">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="point" type="tns:LonLatPt" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="LonLatPt">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Lon" type="s:double" />
<s:element minOccurs="1" maxOccurs="1" name="Lat" type="s:double" />
</s:sequence>
</s:complexType>
<s:element name="ConvertLonLatPtToNearestPlaceResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="ConvertLonLatPtToNearestPlaceResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="ConvertLonLatPtToUtmPt">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="point" type="tns:LonLatPt" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="ConvertLonLatPtToUtmPtResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="ConvertLonLatPtToUtmPtResult" type="tns:UtmPt" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="UtmPt">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Zone" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="X" type="s:double" />
<s:element minOccurs="1" maxOccurs="1" name="Y" type="s:double" />
</s:sequence>
</s:complexType>
<s:element name="ConvertUtmPtToLonLatPt">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="utm" type="tns:UtmPt" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="ConvertUtmPtToLonLatPtResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="ConvertUtmPtToLonLatPtResult" type="tns:LonLatPt" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="ConvertPlaceToLonLatPt">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="place" type="tns:Place" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="Place">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="City" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="State" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="Country" type="s:string" />
</s:sequence>
</s:complexType>
<s:element name="ConvertPlaceToLonLatPtResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="ConvertPlaceToLonLatPtResult" type="tns:LonLatPt" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="CountPlacesInRect">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="upperleft" type="tns:LonLatPt" />
<s:element minOccurs="1" maxOccurs="1" name="lowerright" type="tns:LonLatPt" />
<s:element minOccurs="1" maxOccurs="1" name="ptype" type="tns:PlaceType" />
</s:sequence>
</s:complexType>
</s:element>
<s:simpleType name="PlaceType">
<s:restriction base="s:string">
<s:enumeration value="UnknownPlaceType" />
<s:enumeration value="AirRailStation" />
<s:enumeration value="BayGulf" />
<s:enumeration value="CapePeninsula" />
<s:enumeration value="CityTown" />
<s:enumeration value="HillMountain" />
<s:enumeration value="Island" />
<s:enumeration value="Lake" />
<s:enumeration value="OtherLandFeature" />
<s:enumeration value="OtherWaterFeature" />
<s:enumeration value="ParkBeach" />
<s:enumeration value="PointOfInterest" />
<s:enumeration value="River" />
</s:restriction>
</s:simpleType>
<s:element name="CountPlacesInRectResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="CountPlacesInRectResult" type="s:int" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetAreaFromPt">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="center" type="tns:LonLatPt" />
<s:element minOccurs="1" maxOccurs="1" name="theme" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="scale" type="tns:Scale" />
<s:element minOccurs="1" maxOccurs="1" name="displayPixWidth" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="displayPixHeight" type="s:int" />
</s:sequence>
</s:complexType>
</s:element>
<s:simpleType name="Scale">
<s:restriction base="s:string">
<s:enumeration value="Scale1mm" />
<s:enumeration value="Scale2mm" />
<s:enumeration value="Scale4mm" />
<s:enumeration value="Scale8mm" />
<s:enumeration value="Scale16mm" />
<s:enumeration value="Scale32mm" />
<s:enumeration value="Scale63mm" />
<s:enumeration value="Scale125mm" />
<s:enumeration value="Scale250mm" />
<s:enumeration value="Scale500mm" />
<s:enumeration value="Scale1m" />
<s:enumeration value="Scale2m" />
<s:enumeration value="Scale4m" />
<s:enumeration value="Scale8m" />
<s:enumeration value="Scale16m" />
<s:enumeration value="Scale32m" />
<s:enumeration value="Scale64m" />
<s:enumeration value="Scale128m" />
<s:enumeration value="Scale256m" />
<s:enumeration value="Scale512m" />
<s:enumeration value="Scale1km" />
<s:enumeration value="Scale2km" />
<s:enumeration value="Scale4km" />
<s:enumeration value="Scale8km" />
<s:enumeration value="Scale16km" />
<s:enumeration value="Scale32km" />
<s:enumeration value="Scale64km" />
<s:enumeration value="Scale128km" />
<s:enumeration value="Scale256km" />
<s:enumeration value="Scale512km" />
<s:enumeration value="Scale1024km" />
<s:enumeration value="Scale2048km" />
</s:restriction>
</s:simpleType>
<s:element name="GetAreaFromPtResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="GetAreaFromPtResult" type="tns:AreaBoundingBox" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="AreaBoundingBox">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="NorthWest" type="tns:AreaCoordinate" />
<s:element minOccurs="1" maxOccurs="1" name="NorthEast" type="tns:AreaCoordinate" />
<s:element minOccurs="1" maxOccurs="1" name="SouthWest" type="tns:AreaCoordinate" />
<s:element minOccurs="1" maxOccurs="1" name="SouthEast" type="tns:AreaCoordinate" />
<s:element minOccurs="1" maxOccurs="1" name="Center" type="tns:AreaCoordinate" />
<s:element minOccurs="0" maxOccurs="1" name="NearestPlace" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="OverlappingThemeInfos" type="tns:ArrayOfOverlappingThemeInfo" />
</s:sequence>
</s:complexType>
<s:complexType name="AreaCoordinate">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="TileMeta" type="tns:TileMeta" />
<s:element minOccurs="1" maxOccurs="1" name="Offset" type="tns:LonLatPtOffset" />
</s:sequence>
</s:complexType>
<s:complexType name="TileMeta">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Id" type="tns:TileId" />
<s:element minOccurs="1" maxOccurs="1" name="TileExists" type="s:boolean" />
<s:element minOccurs="1" maxOccurs="1" name="NorthWest" type="tns:LonLatPt" />
<s:element minOccurs="1" maxOccurs="1" name="NorthEast" type="tns:LonLatPt" />
<s:element minOccurs="1" maxOccurs="1" name="SouthWest" type="tns:LonLatPt" />
<s:element minOccurs="1" maxOccurs="1" name="SouthEast" type="tns:LonLatPt" />
<s:element minOccurs="1" maxOccurs="1" name="Center" type="tns:LonLatPt" />
<s:element minOccurs="1" maxOccurs="1" name="Capture" type="s:dateTime" />
</s:sequence>
</s:complexType>
<s:complexType name="TileId">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Theme" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="Scale" type="tns:Scale" />
<s:element minOccurs="1" maxOccurs="1" name="Scene" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="X" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="Y" type="s:int" />
</s:sequence>
</s:complexType>
<s:complexType name="LonLatPtOffset">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Point" type="tns:LonLatPt" />
<s:element minOccurs="1" maxOccurs="1" name="XOffset" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="YOffset" type="s:int" />
</s:sequence>
</s:complexType>
<s:complexType name="ArrayOfOverlappingThemeInfo">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="OverlappingThemeInfo" type="tns:OverlappingThemeInfo" />
</s:sequence>
</s:complexType>
<s:complexType name="OverlappingThemeInfo">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="LocalTheme" type="s:boolean" />
<s:element minOccurs="1" maxOccurs="1" name="Theme" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="Point" type="tns:LonLatPt" />
<s:element minOccurs="0" maxOccurs="1" name="ThemeName" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="Capture" type="s:dateTime" />
<s:element minOccurs="1" maxOccurs="1" name="ProjectionId" type="tns:ProjectionType" />
<s:element minOccurs="1" maxOccurs="1" name="LoScale" type="tns:Scale" />
<s:element minOccurs="1" maxOccurs="1" name="HiScale" type="tns:Scale" />
<s:element minOccurs="0" maxOccurs="1" name="Url" type="s:string" />
</s:sequence>
</s:complexType>
<s:simpleType name="ProjectionType">
<s:restriction base="s:string">
<s:enumeration value="Geographic" />
<s:enumeration value="UtmNad27" />
<s:enumeration value="UtmNad83" />
</s:restriction>
</s:simpleType>
<s:element name="GetAreaFromRect">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="upperLeft" type="tns:LonLatPt" />
<s:element minOccurs="1" maxOccurs="1" name="lowerRight" type="tns:LonLatPt" />
<s:element minOccurs="1" maxOccurs="1" name="theme" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="scale" type="tns:Scale" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetAreaFromRectResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="GetAreaFromRectResult" type="tns:AreaBoundingBox" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetAreaFromTileId">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="id" type="tns:TileId" />
<s:element minOccurs="1" maxOccurs="1" name="displayPixWidth" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="displayPixHeight" type="s:int" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetAreaFromTileIdResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="GetAreaFromTileIdResult" type="tns:AreaBoundingBox" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetLatLonMetrics">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="point" type="tns:LonLatPt" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetLatLonMetricsResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetLatLonMetricsResult" type="tns:ArrayOfThemeBoundingBox" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ArrayOfThemeBoundingBox">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="ThemeBoundingBox" type="tns:ThemeBoundingBox" />
</s:sequence>
</s:complexType>
<s:complexType name="ThemeBoundingBox">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Theme" type="s:int" />
<s:element minOccurs="0" maxOccurs="1" name="ThemeName" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="Sparseness" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="LoScale" type="tns:Scale" />
<s:element minOccurs="1" maxOccurs="1" name="HiScale" type="tns:Scale" />
<s:element minOccurs="1" maxOccurs="1" name="ProjectionId" type="tns:ProjectionType" />
<s:element minOccurs="0" maxOccurs="1" name="ProjectionName" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="WestLongitude" type="s:double" />
<s:element minOccurs="1" maxOccurs="1" name="NorthLatitude" type="s:double" />
<s:element minOccurs="1" maxOccurs="1" name="EastLongitude" type="s:double" />
<s:element minOccurs="1" maxOccurs="1" name="SouthLatitude" type="s:double" />
</s:sequence>
</s:complexType>
<s:element name="GetPlaceFacts">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="place" type="tns:Place" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetPlaceFactsResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="GetPlaceFactsResult" type="tns:PlaceFacts" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="PlaceFacts">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Place" type="tns:Place" />
<s:element minOccurs="1" maxOccurs="1" name="Center" type="tns:LonLatPt" />
<s:element minOccurs="1" maxOccurs="1" name="AvailableThemeMask" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="PlaceTypeId" type="tns:PlaceType" />
<s:element minOccurs="1" maxOccurs="1" name="Population" type="s:int" />
</s:sequence>
</s:complexType>
<s:element name="GetPlaceList">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="placeName" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="MaxItems" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="imagePresence" type="s:boolean" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetPlaceListResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetPlaceListResult" type="tns:ArrayOfPlaceFacts" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ArrayOfPlaceFacts">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="PlaceFacts" type="tns:PlaceFacts" />
</s:sequence>
</s:complexType>
<s:element name="GetPlaceListInRect">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="upperleft" type="tns:LonLatPt" />
<s:element minOccurs="1" maxOccurs="1" name="lowerright" type="tns:LonLatPt" />
<s:element minOccurs="1" maxOccurs="1" name="ptype" type="tns:PlaceType" />
<s:element minOccurs="1" maxOccurs="1" name="MaxItems" type="s:int" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetPlaceListInRectResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetPlaceListInRectResult" type="tns:ArrayOfPlaceFacts" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetTheme">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="theme" type="s:int" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetThemeResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="GetThemeResult" type="tns:ThemeInfo" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ThemeInfo">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Theme" type="s:int" />
<s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="Description" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="Supplier" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="LoScale" type="tns:Scale" />
<s:element minOccurs="1" maxOccurs="1" name="HiScale" type="tns:Scale" />
<s:element minOccurs="1" maxOccurs="1" name="ProjectionId" type="tns:ProjectionType" />
<s:element minOccurs="0" maxOccurs="1" name="ProjectionName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="CopyrightNotice" type="s:string" />
</s:sequence>
</s:complexType>
<s:element name="GetTileMetaFromLonLatPt">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="point" type="tns:LonLatPt" />
<s:element minOccurs="1" maxOccurs="1" name="theme" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="scale" type="tns:Scale" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetTileMetaFromLonLatPtResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="GetTileMetaFromLonLatPtResult" type="tns:TileMeta" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetTileMetaFromTileId">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="id" type="tns:TileId" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetTileMetaFromTileIdResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="GetTileMetaFromTileIdResult" type="tns:TileMeta" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetTile">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="id" type="tns:TileId" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetTileResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetTileResult" type="s:base64Binary" />
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
</wsdl:types>
<wsdl:message name="ConvertLonLatPtToNearestPlaceSoapIn">
<wsdl:part name="parameters" element="tns:ConvertLonLatPtToNearestPlace" />
</wsdl:message>
<wsdl:message name="ConvertLonLatPtToNearestPlaceSoapOut">
<wsdl:part name="parameters" element="tns:ConvertLonLatPtToNearestPlaceResponse" />
</wsdl:message>
<wsdl:message name="ConvertLonLatPtToUtmPtSoapIn">
<wsdl:part name="parameters" element="tns:ConvertLonLatPtToUtmPt" />
</wsdl:message>
<wsdl:message name="ConvertLonLatPtToUtmPtSoapOut">
<wsdl:part name="parameters" element="tns:ConvertLonLatPtToUtmPtResponse" />
</wsdl:message>
<wsdl:message name="ConvertUtmPtToLonLatPtSoapIn">
<wsdl:part name="parameters" element="tns:ConvertUtmPtToLonLatPt" />
</wsdl:message>
<wsdl:message name="ConvertUtmPtToLonLatPtSoapOut">
<wsdl:part name="parameters" element="tns:ConvertUtmPtToLonLatPtResponse" />
</wsdl:message>
<wsdl:message name="ConvertPlaceToLonLatPtSoapIn">
<wsdl:part name="parameters" element="tns:ConvertPlaceToLonLatPt" />
</wsdl:message>
<wsdl:message name="ConvertPlaceToLonLatPtSoapOut">
<wsdl:part name="parameters" element="tns:ConvertPlaceToLonLatPtResponse" />
</wsdl:message>
<wsdl:message name="CountPlacesInRectSoapIn">
<wsdl:part name="parameters" element="tns:CountPlacesInRect" />
</wsdl:message>
<wsdl:message name="CountPlacesInRectSoapOut">
<wsdl:part name="parameters" element="tns:CountPlacesInRectResponse" />
</wsdl:message>
<wsdl:message name="GetAreaFromPtSoapIn">
<wsdl:part name="parameters" element="tns:GetAreaFromPt" />
</wsdl:message>
<wsdl:message name="GetAreaFromPtSoapOut">
<wsdl:part name="parameters" element="tns:GetAreaFromPtResponse" />
</wsdl:message>
<wsdl:message name="GetAreaFromRectSoapIn">
<wsdl:part name="parameters" element="tns:GetAreaFromRect" />
</wsdl:message>
<wsdl:message name="GetAreaFromRectSoapOut">
<wsdl:part name="parameters" element="tns:GetAreaFromRectResponse" />
</wsdl:message>
<wsdl:message name="GetAreaFromTileIdSoapIn">
<wsdl:part name="parameters" element="tns:GetAreaFromTileId" />
</wsdl:message>
<wsdl:message name="GetAreaFromTileIdSoapOut">
<wsdl:part name="parameters" element="tns:GetAreaFromTileIdResponse" />
</wsdl:message>
<wsdl:message name="GetLatLonMetricsSoapIn">
<wsdl:part name="parameters" element="tns:GetLatLonMetrics" />
</wsdl:message>
<wsdl:message name="GetLatLonMetricsSoapOut">
<wsdl:part name="parameters" element="tns:GetLatLonMetricsResponse" />
</wsdl:message>
<wsdl:message name="GetPlaceFactsSoapIn">
<wsdl:part name="parameters" element="tns:GetPlaceFacts" />
</wsdl:message>
<wsdl:message name="GetPlaceFactsSoapOut">
<wsdl:part name="parameters" element="tns:GetPlaceFactsResponse" />
</wsdl:message>
<wsdl:message name="GetPlaceListSoapIn">
<wsdl:part name="parameters" element="tns:GetPlaceList" />
</wsdl:message>
<wsdl:message name="GetPlaceListSoapOut">
<wsdl:part name="parameters" element="tns:GetPlaceListResponse" />
</wsdl:message>
<wsdl:message name="GetPlaceListInRectSoapIn">
<wsdl:part name="parameters" element="tns:GetPlaceListInRect" />
</wsdl:message>
<wsdl:message name="GetPlaceListInRectSoapOut">
<wsdl:part name="parameters" element="tns:GetPlaceListInRectResponse" />
</wsdl:message>
<wsdl:message name="GetThemeSoapIn">
<wsdl:part name="parameters" element="tns:GetTheme" />
</wsdl:message>
<wsdl:message name="GetThemeSoapOut">
<wsdl:part name="parameters" element="tns:GetThemeResponse" />
</wsdl:message>
<wsdl:message name="GetTileMetaFromLonLatPtSoapIn">
<wsdl:part name="parameters" element="tns:GetTileMetaFromLonLatPt" />
</wsdl:message>
<wsdl:message name="GetTileMetaFromLonLatPtSoapOut">
<wsdl:part name="parameters" element="tns:GetTileMetaFromLonLatPtResponse" />
</wsdl:message>
<wsdl:message name="GetTileMetaFromTileIdSoapIn">
<wsdl:part name="parameters" element="tns:GetTileMetaFromTileId" />
</wsdl:message>
<wsdl:message name="GetTileMetaFromTileIdSoapOut">
<wsdl:part name="parameters" element="tns:GetTileMetaFromTileIdResponse" />
</wsdl:message>
<wsdl:message name="GetTileSoapIn">
<wsdl:part name="parameters" element="tns:GetTile" />
</wsdl:message>
<wsdl:message name="GetTileSoapOut">
<wsdl:part name="parameters" element="tns:GetTileResponse" />
</wsdl:message>
<wsdl:portType name="TerraServiceSoap">
<wsdl:operation name="ConvertLonLatPtToNearestPlace">
<wsdl:input message="tns:ConvertLonLatPtToNearestPlaceSoapIn" />
<wsdl:output message="tns:ConvertLonLatPtToNearestPlaceSoapOut" />
</wsdl:operation>
<wsdl:operation name="ConvertLonLatPtToUtmPt">
<wsdl:input message="tns:ConvertLonLatPtToUtmPtSoapIn" />
<wsdl:output message="tns:ConvertLonLatPtToUtmPtSoapOut" />
</wsdl:operation>
<wsdl:operation name="ConvertUtmPtToLonLatPt">
<wsdl:input message="tns:ConvertUtmPtToLonLatPtSoapIn" />
<wsdl:output message="tns:ConvertUtmPtToLonLatPtSoapOut" />
</wsdl:operation>
<wsdl:operation name="ConvertPlaceToLonLatPt">
<wsdl:input message="tns:ConvertPlaceToLonLatPtSoapIn" />
<wsdl:output message="tns:ConvertPlaceToLonLatPtSoapOut" />
</wsdl:operation>
<wsdl:operation name="CountPlacesInRect">
<wsdl:input message="tns:CountPlacesInRectSoapIn" />
<wsdl:output message="tns:CountPlacesInRectSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetAreaFromPt">
<wsdl:input message="tns:GetAreaFromPtSoapIn" />
<wsdl:output message="tns:GetAreaFromPtSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetAreaFromRect">
<wsdl:input message="tns:GetAreaFromRectSoapIn" />
<wsdl:output message="tns:GetAreaFromRectSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetAreaFromTileId">
<wsdl:input message="tns:GetAreaFromTileIdSoapIn" />
<wsdl:output message="tns:GetAreaFromTileIdSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetLatLonMetrics">
<wsdl:input message="tns:GetLatLonMetricsSoapIn" />
<wsdl:output message="tns:GetLatLonMetricsSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetPlaceFacts">
<wsdl:input message="tns:GetPlaceFactsSoapIn" />
<wsdl:output message="tns:GetPlaceFactsSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetPlaceList">
<wsdl:input message="tns:GetPlaceListSoapIn" />
<wsdl:output message="tns:GetPlaceListSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetPlaceListInRect">
<wsdl:input message="tns:GetPlaceListInRectSoapIn" />
<wsdl:output message="tns:GetPlaceListInRectSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetTheme">
<wsdl:input message="tns:GetThemeSoapIn" />
<wsdl:output message="tns:GetThemeSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetTileMetaFromLonLatPt">
<wsdl:input message="tns:GetTileMetaFromLonLatPtSoapIn" />
<wsdl:output message="tns:GetTileMetaFromLonLatPtSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetTileMetaFromTileId">
<wsdl:input message="tns:GetTileMetaFromTileIdSoapIn" />
<wsdl:output message="tns:GetTileMetaFromTileIdSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetTile">
<wsdl:input message="tns:GetTileSoapIn" />
<wsdl:output message="tns:GetTileSoapOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="TerraServiceSoap" type="tns:TerraServiceSoap">
<soap:binding transport="https://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="ConvertLonLatPtToNearestPlace">
<soap:operation soapAction="https://terraservice-usa.com/ConvertLonLatPtToNearestPlace" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="ConvertLonLatPtToUtmPt">
<soap:operation soapAction="https://terraservice-usa.com/ConvertLonLatPtToUtmPt" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="ConvertUtmPtToLonLatPt">
<soap:operation soapAction="https://terraservice-usa.com/ConvertUtmPtToLonLatPt" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="ConvertPlaceToLonLatPt">
<soap:operation soapAction="https://terraservice-usa.com/ConvertPlaceToLonLatPt" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="CountPlacesInRect">
<soap:operation soapAction="https://terraservice-usa.com/CountPlacesInRect" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetAreaFromPt">
<soap:operation soapAction="https://terraservice-usa.com/GetAreaFromPt" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetAreaFromRect">
<soap:operation soapAction="https://terraservice-usa.com/GetAreaFromRect" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetAreaFromTileId">
<soap:operation soapAction="https://terraservice-usa.com/GetAreaFromTileId" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetLatLonMetrics">
<soap:operation soapAction="https://terraservice-usa.com/GetLatLonMetrics" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetPlaceFacts">
<soap:operation soapAction="https://terraservice-usa.com/GetPlaceFacts" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetPlaceList">
<soap:operation soapAction="https://terraservice-usa.com/GetPlaceList" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetPlaceListInRect">
<soap:operation soapAction="https://terraservice-usa.com/GetPlaceListInRect" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetTheme">
<soap:operation soapAction="https://terraservice-usa.com/GetTheme" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetTileMetaFromLonLatPt">
<soap:operation soapAction="https://terraservice-usa.com/GetTileMetaFromLonLatPt" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetTileMetaFromTileId">
<soap:operation soapAction="https://terraservice-usa.com/GetTileMetaFromTileId" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetTile">
<soap:operation soapAction="https://terraservice-usa.com/GetTile" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="TerraService">
<documentation xmlns="https://schemas.xmlsoap.org/wsdl/">TerraServer Web Service</documentation>
<wsdl:port name="TerraServiceSoap" binding="tns:TerraServiceSoap">
<soap:address location="https://terraservice.net/TerraService2.asmx" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Temas relacionados